libA.so 链接到 libB.so
libB.so 的主要链接,但它无法访问 libA.so 的符号。为什么?有没有办法让 libA.so 的符号通过 libB.so 对 main 可见
cat a.cc
#include<iostream>
void hello() {
return;
}
cat b.cc
#include <iostream>
void goodbye() {
return;
}
cat c.cc m
#include<iostream>
void goodbye();
void hello();
void tc() {
goodbye();
hello();
}
cat main.cc
#include<iostream>
void hello();
void goodbye();
int main() {
hello();
}
不确定为什么这不起作用,我怎样才能让它起作用?
g++ -fPIC -c a.cc b.cc
g++ a.o b.o -shared -o libA.so
g++ -fPIC -c c.cc
g++ c.o -shared -lA -L. -o libB.so
g++ main.cc -lA -L.
g++ main.cc -lB -L.
/tmp/cci2foLo.o: undefined reference to symbol '_Z5hellov'
./libA.so: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
ldd libB.so
linux-vdso.so.1 => (0x00007fffa733d000)
libA.so => ./libA.so (0x00002b0f9a92a000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00002b0f9ab5e000)
libm.so.6 => /lib64/libm.so.6 (0x00002b0f9ae64000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00002b0f9b0e8000)
libc.so.6 => /lib64/libc.so.6 (0x00002b0f9b2ff000)
/lib64/ld-linux-x86-64.so.2 (0x00002b0f9a504000)
如何通过 B 将 main 链接到 A?
最佳答案
动态库与普通的可执行程序非常相似,是单独加载的独立且不同的实体。
而且他们只导出自己的符号,而不是它链接到的库的符号。
这意味着 main.cc
可以使用它显式链接到的库中的函数、类和符号。如果您想使用库 A
中的符号,您需要链接到库 A
。
关于C++通过另一个库链接一个库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54512423/