如何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.so
和 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
存档。
我正在尝试第一次涉足图书馆。我正在尝试使用 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
和 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
存档。