C++通过另一个库链接一个库

标签 c++ compiler-errors g++ shared-libraries

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/

相关文章:

compiler-errors - 在 Rust 中,我可以从模块中公开函数数组吗?

c++ - 为什么在这里使用 static char const* 而不是字符串文字会有所不同?

c++ - 由于变体成员,N3690/N4140 与 N4659/N4727,隐式定义的构造函数被删除

c++ - 在 C++ 中,如果复制一个对象是可能的,但确实很昂贵而且通常不是一个好主意,您是否仍然应该使用复制构造函数来实现复制?

c - cl : array type has incomplete element type => why warning and not error?

c++ - 从 C++ 列表库中打印出列表的内容

android - 无法在Android x86平板电脑上安装Android NDK应用程序

c++ - GCC/LD 仅针对直接依赖关系进行链接

c++ - 为什么析构函数构造的两个对象被调用三次

c++ - 如何构建特定函数调用的图形?