首页 > 解决方案 > 如何链接静态库 .o 文件?

问题描述

我正在尝试我第一次涉足图书馆。我正在尝试使用将 Unity 测试框架编译为静态库gcc -c -fPIC -std=c99 -Wall -Wextra -pedantic -Werror -Wmissing-declarations -DUNITY_SUPPORT_64 test-framework/unity.c -o bin/libunity.o

这运行得很好。

但是,当我尝试使用该目标文件时:

$ gcc test_hello_world.c -Lbin -lunity -o test
/usr/bin/ld: cannot find -lunity
collect2: error: ld returned 1 exit status

检查 ld 在做什么

$  ld -Lbin -luinty --verbose
GNU ld (GNU Binutils for Ubuntu) 2.34
  Supported emulations:
   elf_x86_64
   elf32_x86_64
#
# ... script waffle
#
==================================================
ld: mode elf_x86_64
attempt to open bin/libuinty.so failed
attempt to open bin/libuinty.a failed
attempt to open /usr/local/lib/x86_64-linux-gnu/libuinty.so failed
attempt to open /usr/local/lib/x86_64-linux-gnu/libuinty.a failed
attempt to open /lib/x86_64-linux-gnu/libuinty.so failed
attempt to open /lib/x86_64-linux-gnu/libuinty.a failed
attempt to open /usr/lib/x86_64-linux-gnu/libuinty.so failed
attempt to open /usr/lib/x86_64-linux-gnu/libuinty.a failed
attempt to open /usr/lib/x86_64-linux-gnu64/libuinty.so failed
attempt to open /usr/lib/x86_64-linux-gnu64/libuinty.a failed
attempt to open /usr/local/lib64/libuinty.so failed
attempt to open /usr/local/lib64/libuinty.a failed
attempt to open /lib64/libuinty.so failed
attempt to open /lib64/libuinty.a failed
attempt to open /usr/lib64/libuinty.so failed
attempt to open /usr/lib64/libuinty.a failed
attempt to open /usr/local/lib/libuinty.so failed
attempt to open /usr/local/lib/libuinty.a failed
attempt to open /lib/libuinty.so failed
attempt to open /lib/libuinty.a failed
attempt to open /usr/lib/libuinty.so failed
attempt to open /usr/lib/libuinty.a failed
attempt to open /usr/x86_64-linux-gnu/lib64/libuinty.so failed
attempt to open /usr/x86_64-linux-gnu/lib64/libuinty.a failed
attempt to open /usr/x86_64-linux-gnu/lib/libuinty.so failed
attempt to open /usr/x86_64-linux-gnu/lib/libuinty.a failed
ld: cannot find -luinty

所以它寻找bin/libunity.soand bin/libunity.a,但没有bin/libunity.o……我今晚查看的每个互联网页面似乎都假设 ld 应该拾取 ".o" 文件,就像 ".so" 或 ".a" 没有问题(手册页似乎同样期待它或根本不提及“.o”)......但它不是......

我是不是误会了什么?缺少一些论点?

编辑:我现在已经运行ar rcs bin/libunity.a bin/unity.o,然后是gcc上面的命令。这似乎有效(还有其他错误)。但我仍然认为 ld 应该使用 .o 文件,是我和一半的网络,错了吗?

标签: clinkerld

解决方案


这应该有效:

$ gcc test_hello_world.c bin/libunity.o -o test

可能甚至不应该真正使用“库”这个词来描述*.o文件。从未听说过lib*.o适合lib*.so/文件的lib*.a文件。 *.o文件直接链接,没有任何libfoo.o==>-lfoo魔法。

或者,如果您想.o变成.a, 则使用$ ar -crs libunity.a libunity.o, (另请参见:https ://www.howtogeek.com/427086/how-to-use-linuxs-ar-command-to-create-static-libraries/ )。静态库是ar包含一个或多个目标文件的存档。


推荐阅读