【发布时间】:2015-01-18 08:26:16
【问题描述】:
全部。
使用 gcc 工具链编译简单的东西几年了,今天我遇到了一个奇怪的现象。
我将 Kubuntu 14.04 安装到一台普通的桌面 i686 机器上,其中装有 gcc 4.8.2。但是后来,试图构建一些从我的本地存储库中提取的编码良好的东西,我遇到了大量的“未定义引用”消息。代码在 Ubuntu 11.04 / gcc 4.5.2 下编译、链接和运行良好。
我检查了链接过程(通过 -Wl,--verbose 到 gcc),认为它有效。它会找到我在链接命令中指定的所有库。 objdump -t myLib.so 带来的正是我所期望的符号 - 但链接器看不到它们。
检查 pthread 库也会带来相应的符号,只是它们带有一些 @GLIBC... 东西的后缀。到目前为止没有检查链接器/加载器技巧。
样例
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
static void *fooo (void *xxx) {
char *txt = (char*)xxx;
printf("My job is to print this :'%s'. Bye now!\n", txt);
return 0;
}
int main (int argc, char *argv[]) {
pthread_t thd;
pthread_create(&thd, NULL, fooo, "A POSIX thread");
sleep(1);
return 0;
}
在旧系统上运行得很好,只是说
gcc -l pthread fooo.c && ./a.out
但在与 4.8.2 的链接步骤中中断。
任何想法都会非常受欢迎。
.M
【问题讨论】:
-
能否请您添加错误信息
-
Linker order - GCC的可能重复
-
@JoachimPileborg 我猜不是因为只有一个库链接到程序中。我们肯定需要确切的错误信息。
-
试试 gcc -pthread -o fooo fooo.c && ./fooo 而不是 gcc -l pthread
-
@sfrehse 重要的是依赖关系的顺序,而不是如果一个库使用另一个库。文件
fooo.c依赖于pthread库,因此它必须在命令行上的-lpthread之前。