【发布时间】:2016-04-01 23:52:43
【问题描述】:
在我生命中的某个时间点,传递给 gcc 的库的顺序很重要。您将 gcc 传递给从最依赖到最不依赖的库列表。例如考虑以下源代码:
testlib.c
include <math.h>
double proxy_sqrt(double x)
{
return sqrt(x);
}
testlib.h
double proxy_sqrt(double);
使用-testlib.c
#include "testlib.h"
int main(int argc, char* argv[])
{
proxy_sqrt(36);
return 0;
}
然后编译链接:
gcc -c -o testlib.o testlib.c
ar rvs testlib.a testlib.o
gcc -o use-testlib use-testlib.c testlib.a -lm
请注意,最后一步使用依赖程度最高到最小的顺序。
但是这个(无效的?)命令在 SLES12 上有效
gcc -o use-testlib use-testlib.c -lm testlib.a
但在 Ubuntu 14.04 上失败......
gcc -o use-testlib use-testlib.c -lm testlib.a
testlib.a(testlib.o): In function `proxy_sqrt':
testlib.c:(.text+0x1b): undefined reference to `sqrt'
collect2: error: ld returned 1 exit status
有人知道为什么吗?
2 个编译器的详细输出显示在以下链接中:
sles12
ubuntu14.04
【问题讨论】:
-
您确定就是您创建
testlib.o对象文件的方式吗?你不应该在那里使用-c标志吗? -
至于你的问题,你在不同平台上使用的是什么链接器,尤其是 version 是什么?
-
使用
-v标志来查看你的链接器是如何真正被调用的。您可能会发现libm是一个系统的默认值,而不是另一个系统的默认值.... -
@CarlNorum 也发生在其他库中。这是真实案例的简化示例。
-
@sashan,你还是应该弄清楚你的链接器到底在做什么。
标签: c gcc linker ubuntu-14.04 suse