如何让链接器报告它为给定函数链接到的位置

How to get linker to report where it is linking to for a given function

我在尝试在 linux 主机上交叉构建 win32 和 win64 exe 时遇到问题。

我正在使用 mingw 交叉构建工具链

我的 .c 文件包含 time.h 以便在 main()

中使用 clock_gettime()

现在这是一个 POSIX 的东西所以不能保证它 windows 便携

然而,在另一台具有类似(但显然不相同)设置的笔记本电脑上它确实可以编译并且link没问题

在这台笔记本电脑(我要迁移到的新笔记本电脑)上,我收到 linker 错误:

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

我想做的是以某种方式让另一台机器上的 linker 告诉我它在哪里找到带有 clock_gettime() 的 .dll

为了让我看看新笔记本电脑上是否存在类似的 .dll 以及 clock_gettime() 符号是否可用

是否可以让 linker 报告此信息,也许是某种详细模式。我已经走上了 GIYF 路线,但到目前为止还是一片空白。

使用 glibc 版本 < 2.17 所需的 -lrt 进行编译。

other 笔记本电脑上可能发生的事情是它有一个最新版本的 glibc >=2.17,其中 clock_gettime() 是 libc 的一部分。但在 glibcs​​ 中较旧,它是一个单独的库。因此,您需要自己link。

在 linux 主机上使用 mingw 工具链为 windows 交叉构建时,要使用 <time.h> 中定义的 clock_gettime(),您必须 link 到 pthread 不是 rt

例如:

源代码,example.c,如下所示:

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

本机构建如下所示:

gcc example.o -lrt -o example

win32 cross-build 看起来像这样:

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

不幸的是,在如何让 linker 告诉我它在哪个库中找到它已成功 link 的函数方面,我 none 更聪明

即如果我能以某种方式让 linker 通知我它在我的另一台机器上的 libpthread 中找到 clock_gettime() 并成功 linking,我本可以节省很多忙着解决这台机器上的 link 错误问题。