如何link静态库.o文件?

How to link static library .o files?

我正在尝试第一次涉足图书馆。我正在尝试使用 gcc -c -fPIC -std=c99 -Wall -Wextra -pedantic -Werror -Wmissing-declarations -DUNITY_SUPPORT_64 test-framework/unity.c -o bin/libunity.o

将 Unity 测试框架编译为静态库

这个运行很好。

然而,当我尝试使用该目标文件时:

$ 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.sobin/libunity.a,但没有 bin/libunity.o...我今晚看过的每个互联网页面似乎都假设 ld 应该接收“ .o”文件与“.so”或“.a”一样没有问题(手册页似乎同样期望它或根本不提及“.o”)......但它不是......

我是不是误会了什么?缺少一些参数?

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

这应该有效:

$ 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 存档。