仅针对直接依赖关系链接GCC/LD
GCC/LD Only link against direct dependencies
我有一个场景,其中我有一种依赖于库a的二进制文件,而库a又依赖于库B。
我已经针对库B构建了库A,但库B:s的符号都没有从库A中泄漏出来,所有内容都包含在cpp文件中。
现在我只想将二进制与库A链接,因为在二进制中找到的所有符号都可以由库A满足。这可能吗?
在实际应用程序中,库B是一个网络协议的实现,我有很多二进制文件链接到中间库。我不希望二进制文件知道所使用的不同网络协议。
平台:Linux/GCC
代码:
liba/liba.h:
#ifndef LIBA_H
#define LIBA_H
int getANumber();
#endif
liba/liba.cp:
#include "liba.h"
#include "../libb/libb.h"
int getANumber(){ return getBNumber(); }
libb/libb.h:
#ifndef LIBB_H
#define LIBB_H
int getBNumber();
#endif
libb/libb.cpp:
#include "libb.h"
int getBNumber(){ return 42; }
main.cpp:
#include "liba/liba.h"
#include <iostream>
int main(int argc, char** argv) {
std::cout << getANumber() << std::endl;
return 0;
}
命令:
~/libb/ $ g++ -shared -o libb.so libb.cpp
~/liba/ $ g++ -shared -o liba.so liba.cpp -L../libb -lb
~/ $ g++ -o main main.cpp -Lliba -la # fails
~/ # These two work, but I don't want to specify libb here.
~/ $ g++ -o main main.cpp -Lliba -la -Wl,-rpath-link,libb
~/ $ LD_LIBRARY_PATH=libb g++ -o main main.cpp -Lliba -la
解决这个问题的最佳方法是什么?我必须将其创建为插件吗?
谨致问候,Daniel
如果你想在运行时更改你使用的库,那么你不能直接链接它,而是使用"手动"加载。换句话说,调用dlopen
和dlsym
这可能也意味着你需要在"liba"中有一个稍微不同的体系结构,因为"libb"中的每个函数都变成了一个函数指针,所以沿着以下几条线:
int (*getBNumber)() = NULL;
void initialize()
{
void *handle = dlopen("libb", RTLD_NOW);
getBNumber = (int (*)())dlsym(handle, "getBNumber");
}
int getANumber(){ return getBNumber(); }
您需要设置一些东西,以便在某个时刻调用initialize,或者在每个函数中都有一个if (!initialized) initialize();
。
相关文章:
- 使用gcc从静态链接的文件中查找可选符号
- 有了gcc,是否可以链接库,但前提是它存在
- 未知的 GCC 链接器错误,但已成功构建
- 程序使用boost::文件系统链接clang,但不使用gcc
- 链接时 GCC 内存过载
- 微控制器的首次 gcc 链接器脚本编译但不运行
- 使用 gcc 6 构建 OpenJDK8 时出现链接错误
- 使用 GCC 的静态和动态链接
- gcc (g++) 如何链接多个库?
- 在这种情况下,GCC 和 clang 是否显示与 Visual Studio 相同的结果,关于语言链接?
- 与NVIDIA链接的错误GCC版本
- 链接库时的默认目录上的GCC或G 路径搜索顺序
- C++ MinGW GCC CodeBlocks静态链接
- GTEST链接错误(从GCC 4.X移动到GCC 7.x)
- 链接 gcc 6、gcc 7 和 gcc 8 对象是否安全?
- 如何动态链接 GCC 对象
- Sun Studio 链接 gcc 库:例外不起作用
- 仅针对直接依赖关系链接GCC/LD
- 如何链接GCC中的libc和libstdc++的调试版本
- 链接GCC中的库