Как получить компоновщик, чтобы сообщить, где он ссылается на данную функцию

У меня проблема с попыткой кросс-сборки win32 и win64 exes на хосте linux.

Я использую набор инструментов mingw cross build

мой .c файл включает в себя time.h для того, чтобы использовать clock_gettime() в main()

теперь это POSIX вещь, так что нет гарантии, что это портативный Windows

однако на другом ноутбуке с аналогичной (но явно не идентичной) настройкой он компилируется и связывается без проблем

на этом ноутбуке (новый, на который я мигрирую) я получаю ошибку компоновщика:

undefined reference to `clock_gettime'
collect2: error: ld returned 1 exit status

я хотел бы, чтобы компоновщик на другой машине сказал мне, где он находит.dll с clock_gettime() в нем

Для того, чтобы я увидел, есть ли аналогичный.dll на новом ноутбуке и есть ли в нем символ clock_gettime()

Можно ли заставить компоновщик сообщить эту информацию, возможно, в каком-то подробном режиме. Я пошел по маршруту GIYF, но до сих пор не указал.

2 ответа

Решение

Использовать clock_gettime() как определено в <time.h> когда кросс-сборка для окон с использованием mingw toolchain на хосте Linux, вы должны сделать ссылку на pthread не rt

например:

Исходный код, example.c, выглядит так:

#include <time.h>
...
struct timespec t1;
...
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &t1);

Нативная сборка выглядит так:

gcc example.o -lrt -o example

Win32 кросс-билд выглядит так:

i686-w64-mingw32-gcc -I/usr/local/i686-w64-mingw32/include  example.o -L/usr/local/i686-w64-mingw32/bin -lpthread -lws2_32 -o example.exe

К сожалению, я не знаю, как заставить компоновщик сказать мне, в какой библиотеке он нашел функцию, с которой он успешно связался

то есть, если бы я мог каким-то образом заставить компоновщик сообщить мне, что он обнаружил clock_gettime() в libpthread на моем другом компьютере, который успешно связывался, я мог бы избавиться от множества ошибок по исправлению ошибки связи на этом компьютере.

Компилировать с -lrt что необходимо для версии glibc < 2.17.

Что, вероятно, происходит на другом ноутбуке, так это то, что он имеет последнюю версию glibc >=2.17, в которой clock_gettime() является частью libc. Но старше в glibcs, это отдельная библиотека. Следовательно, вам нужно было связать это самостоятельно.

Другие вопросы по тегам