c - 如何链接静态库 .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.so
and bin/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
包含一个或多个目标文件的存档。
推荐阅读
- ios - iOS Simulator connection timed out
- python-3.x - PySide2 and pyinstaller gui application won't run on certain windows computers
- r - Get object and indices from subsetting call
- java - 访问外部类中的静态变量时静态内部线程的问题
- android - Calculate sum of recyclerview item double values
- asp.net - 在 MVC 编辑视图中将模型值设置为 CKeditor
- python - Cython 中的枚举成员名称重复 - 重新声明错误?
- azure - 如何在 ServiceBus 消息头中发送/接收数据
- php - 通过 phpmailer 发送巨大的 html 邮件
- node.js - 动态更改用户为 SPA (node.js) 实时提供的 html