我正在尝试使用 --enable-64 为 Windows 编译 Octave nsi-installer 以支持大型阵列。
尝试 1:在 Windows 10 上使用 Linux Mint 虚拟机:
./configure 显示一切似乎都正常,运行 make 后,完成了很多工作。但是,进入“[build] default-octave”几分钟后,它就崩溃了。查看日志,当尝试链接 liboctave/.libs/liboctave-3.dll 时,它说:
libgnu/.libs/libgnu.a(lock.o):在函数
glthread_recursive_lock_init_multithreaded': /home/mike/temp/mxe-octave-3fc30cd416ac/tmp-default-octave/octave-4.1.0+/libgnu/glthread/lock.c:289: undefined reference to
__imp_pthread_mutexattr_init'/home/mike/temp/mxe-octave-3fc30cd416ac/tmp-default-octave/octave-4.1.0+/libgnu/glthread/lock。 c:292: 未定义引用__imp_pthread_mutexattr_settype' /home/mike/temp/mxe-octave-3fc30cd416ac/tmp-default-octave/octave-4.1.0+/libgnu/glthread/lock.c:298: undefined reference to
__imp_pthread_mutex_init' /home/mike/temp/mxe-octave-3fc30cd416ac/tmp-default-octave/octave-4.1.0+/libgnu/glthread/lock.c:304: 未定义引用__imp_pthread_mutexattr_destroy' /home/mike/temp/mxe-octave-3fc30cd416ac/tmp-default-octave/octave-4.1.0+/libgnu/glthread/lock.c:301: undefined reference to
__imp_pthread_mutexattr_destroy' /home/mike/temp/mxe-octave-3fc30cd416ac/tmp-default-octave/octave-4.1.0+/libgnu/glthread/lock.c:295:未定义对__imp_pthread_mutexattr_destroy' libgnu/.libs/libgnu.a(strsignal.o): In function
init'的引用:/home/mike/temp/mxe -octave-3fc30cd416ac/tmp-default-octave/octave-4.1.0+/libgnu/strsignal.c:143:未定义对__imp_pthread_key_create' libgnu/.libs/libgnu.a(strsignal.o): In function
free_key_mem'的引用:/home/mike/temp/mxe-octave-3fc30cd416ac/tmp-default-octave /octave-4.1.0+/libgnu/strsignal.c:170:未定义的引用__imp_pthread_setspecific' libgnu/.libs/libgnu.a(strsignal.o): In function
strsignal':/home/mike/temp/mxe-octave-3fc30cd416ac/tmp-default-octave/octave-4.1.0+/libgnu/strsignal.c:101:未定义对__imp_pthread_once' libgnu/.libs/libgnu.a(strsignal.o): In function
getbuffer的引用':/home/mike/temp/ mxe-octave-3fc30cd416ac/tmp-default-octave/octave-4.1.0+/libgnu/strsignal.c:186:未定义对__imp_pthread_getspecific' /home/mike/temp/mxe-octave-3fc30cd416ac/tmp-default-octave/octave-4.1.0+/libgnu/strsignal.c:195: undefined reference to
__imp_pthread_setspecific'collect2 的引用:错误:ld 返回 1 个退出状态
所以,问题在于 lock.c 中所有这些对 '__imp_pthread_' 函数的未定义引用。
当我在这些行中查看 lock.c 时,代码显示:
err = pthread_mutexattr_init (&attributes);
所以我的主要问题是,为什么在链接中将“__imp_”添加到函数的前面?
如果我'nm libpthread.so',我会看到类似的东西:
pthread_mutexattr_init.o: 0000000000000000 T __pthread_mutexattr_init 0000000000000000 T pthread_mutexattr_init
所以功能在那里,但链接看不到它们,因为附加了'__imp_'?我不明白...
日志显示使用了“-pthread”而不是“-lpthread”,我认为这是推荐的。当我查看日志顶部时,它显示:
检查 pthreads 库 -lpthreads... 否
检查 pthreads 是否在没有任何标志的情况下工作...否
检查 pthreads 是否与 -Kthread 一起工作...否
检查 pthreads 是否与 -kthread 一起工作...否
检查 pthreads 库 -llthread... 否
检查 pthreads 是否与 -pthread 一起工作...是
检查可连接的 pthread 属性... PTHREAD_CREATE_JOINABLE
检查 pthread 是否需要更多特殊标志...否
尝试2:使用CentOS linux系统:
与上面类似, ./configure 可以工作,但在“[build] default-octave”中有一点方法,它会崩溃。查看日志,它说:
/u/glaucus-r1/mpjohnso/octave/mxe-octave-3fc30cd416ac/tmp-default-octave/octave-4.1.0+/liboctave/array/dim-vector.h: In instantiation of 'dim_vector::dim_vector(octave_idx_type, octave_idx_type, Ints ...) [with Ints = {int}; octave_idx_type = long long int]':
/u/glaucus-r1/mpjohnso/octave/mxe-octave-3fc30cd416ac/tmp-default-octave/octave-4.1.0+/libinterp/octave-value/ov-typeinfo.h:203:85: required from here
/u/glaucus-r1/mpjohnso/octave/mxe-octave-3fc30cd416ac/tmp-default-octave/octave-4.1.0+/liboctave/array/dim-vector.h:215:5: error: unable to deduce std::initializer_list<_Tp>&&' from '{r, c, lengths#0}'
for (const auto l: {r, c, lengths...})
^
所以,'{r, c, lengths...}' 行的解释方式似乎存在一些问题......我第一次尝试使用 GCC 4.4.7,但是一旦升级到 GCC 6.2.0,同样的事情发生了.
有什么想法吗?