Компиляция nsi-установщика Octave MXE с --enable-64
Я пытаюсь скомпилировать nsi-установщик Octave для Windows с --enable-64 для поддержки больших массивов.
Попытка 1: использование виртуальной машины Linux Mint в Windows 10:
./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: error: ld вернул 1 состояние выхода
Итак, проблема в том, что все эти неопределенные ссылки на функции __imp_pthread_ в lock.c.
Когда я смотрю на 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
проверка, требуются ли дополнительные флажки для pthreads... нет
Попытка 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,
Есть какие-нибудь мысли для того или другого?