Я пытаюсь скомпилировать 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':
__imp_pthread_mutexattr_init»
/home/mike/temp/mxe-octave-3fc30cd416ac/tmp-default-octave/octave-4.1.0+/libgnu/glthread/lock.c:289: undefined reference to
/home/mike/temp/mxe-octave-3fc30cd416ac/tmp-default-octave/octave-4.1.0+/libgnu/glthread/lock.c:292: неопределенная ссылка на__imp_pthread_mutexattr_settype'
__imp_pthread_mutex_init»
/home/mike/temp/mxe-octave-3fc30cd416ac/tmp-default-octave/octave-4.1.0+/libgnu/glthread/lock.c:298: undefined reference to
/home/mike/temp/mxe-octave-3fc30cd416ac/tmp-default-octave/octave-4.1.0+/libgnu/glthread/lock.c:304: неопределенная ссылка на__imp_pthread_mutexattr_destroy'
__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
/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
/home/mike/temp/mxe-octave-3fc30cd416ac/tmp-default-octave/octave-4.1.0+/libgnu/strsignal.c:143: неопределенная ссылка на__imp_pthread_key_create'
free_key_mem ‘:
libgnu/.libs/libgnu.a(strsignal.o): In function
/home/mike/temp/mxe-octave-3fc30cd416ac/tmp-default-octave/octave-4.1.0+/libgnu/strsignal.c:170: неопределенная ссылка на__imp_pthread_setspecific'
strsignal ‘:
libgnu/.libs/libgnu.a(strsignal.o): In function
/home/mike/temp/mxe-octave-3fc30cd416ac/tmp-default-octave/octave-4.1.0+/libgnu/strsignal.c:101: неопределенная ссылка на__imp_pthread_once'
GetBuffer ‘:
libgnu/.libs/libgnu.a(strsignal.o): In function
/home/mike/temp/mxe-octave-3fc30cd416ac/tmp-default-octave/octave-4.1.0+/libgnu/strsignal.c:186: неопределенная ссылка на__imp_pthread_getspecific'
__imp_pthread_setspecific»
/home/mike/temp/mxe-octave-3fc30cd416ac/tmp-default-octave/octave-4.1.0+/libgnu/strsignal.c:195: undefined reference to
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 ,
Есть какие-нибудь мысли для того или другого?
Задача ещё не решена.
Других решений пока нет …