【发布时间】:2021-01-05 10:28:43
【问题描述】:
我正在研究 C++ 链接器(此处为 gnu 链接器)如何解决依赖关系
在静态库和共享库之间,停留在下面的问题中一段时间
下面有3个文件
-
main.cpp(取决于foo.cpp) -
foo.cpp(取决于boo.cpp) boo.cpp
// main.cpp
#include <iostream>
extern int foo();
int main()
{
std::cout << foo() << std::endl;
}
// foo.cpp
extern int boo();
int foo()
{
return boo();
}
// boo.cpp
int boo()
{
return 10;
}
如果我将 foo.cpp 和 boo.cpp 作为库并将它们与 main.cpp 链接以生成可执行文件
然后结果在以下四种不同情况下有所不同
为什么只有第一个失败,而其他人成功?
静态库做静态库不能自己解决依赖?
(1) 构建失败
# static library boo
$ g++ -static -c -o boo.o boo.cpp
$ ar rcs libboo.a libboo.o
# static library foo
$ g++ -static -c -o foo.o foo.cpp -lboo -L.
$ ar rcs libfoo.a foo.o
# pass libfoo.a only for the executable
$ g++ -o a.out main.cpp -lfoo -L.
/usr/bin/ld: ./libfoo.a(libfoo.o): in function `foo()':
foo.cpp:(.text+0x9): undefined reference to `boo()'
collect2: error: ld returned 1 exit status
(2) 构建成功
# static library boo
$ g++ -static -c -o boo.o boo.cpp
$ ar rcs libboo.a libboo.o
# static library foo
$ g++ -static -c -o foo.o foo.cpp -lboo -L.
$ ar rcs libfoo.a foo.o
# pass libfoo.a and libboo.a for the executable
$ g++ -o a.out main.cpp -lfoo -lboo -L.
(3) 构建成功
# static library boo
$ g++ -static -c -o libboo.o boo.cpp
$ ar rcs libboo.a libboo.o
# shared library foo
$ g++ -shared -fpic -o libfoo.so foo.cpp -lboo -L.
# pass libfoo.so only for the executable
$ g++ -o a.out main.cpp -lfoo -L.
(4) 构建成功
# shared library boo
$ g++ -shared -fpic -o libboo.so boo.cpp
# shared library foo
$ g++ -shared -fpic -o libfoo.so foo.cpp -lboo -L.
# pass libfoo.so only for the executable
$ g++ -o a.out main.cpp -lfoo -L.
【问题讨论】:
标签: gcc linker g++ shared-libraries