我有一个C项目,它使用了几个对象文件,这些文件需要按特定顺序链接才能找到所有需要的符号。
例如,此命令运行良好(lib2.o取决于lib1.o等)
gcc -o my_app main.o lib1.o lib2.o lib3.o -lm
但是
gcc -o my_app main.o lib3.o lib2.o lib1.o -lm
以对"my_variable"错误的未定义引用结束。
这是一种已知的行为,例如可以通过将这些对象添加到链接器脚本中的GROUP部分来解决。
现在,我想将这些对象作为静态库与我的同事共享。所以…
ar -rcs mylib.a lib1.o lib2.o lib3.o
gcc -o my_app main.o mylib.a -lm
不幸的是,这会产生同样的未定义引用错误,比如以不正确的顺序指定对象。
我没有找到任何链接器或归档器选项使其工作,也没有通过谷歌搜索的解决方案,即使我认为这个问题应该相对常见。
有人知道解决办法吗?
问候一月
这可能是链接顺序问题。当GNU链接器看到一个库时,它会丢弃所有不需要的符号。它也以从左到右的顺序执行此操作。
最新版本的gcc/ld默认使用--as-needed
标志进行链接。
这意味着,如果你在C文件之前写-lmylib.a
,库将自动被排除在外(当测试是否需要这样的东西时,顺序很重要)
您可以使用以下任一项解决此问题:
gcc -L. -o example example.c -lmylib.a
gcc -L. -Wl,--no-as-needed -o example example.c -lmylib.a
后者将--no-as-needed
传递给链接器,这将导致库仍然被链接,即使您没有从中调用任何外部函数。
您的错误表明问题出现在您的某个库中?。o文件[lib{later}.o依赖于lib{early}.o]
你是如何编译它们的
是否有任何编译警告
我使用C已经有一段时间了,但我认为您需要在具有依赖关系的库中包含依赖库——这可能是您找不到太多引用该问题的原因,因为它并不真正存在。