我有一个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
不幸的是,这会产生相同的未定义引用错误,例如以不正确的顺序指定对象。
我没有找到任何链接器或归档器选项来使其正常工作,即使我认为这个问题应该相对普遍,也没有googling解决方案。
请有人知道解决方案吗?
问候 扬
答案 0 :(得分:3)
这可能是链接订单问题。当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
传递给链接器,这会导致库仍然被链接,即使您没有从中调用任何外部函数。
答案 1 :(得分:0)
您的错误意味着问题出现在您的一个lib?.o文件中[lib {later} .o取决于lib {更早} .o]
你是如何设法编译它们的?
有编辑警告吗?
自从我使用C以来已经有一段时间了,但我认为您需要在库中包含具有依赖关系的依赖库 - 这可能是您找不到太多引用问题的原因,因为它确实存在不存在。