c++ - 自动生成动态加载.so库的导入模块

标签 c++ linux linker shared-libraries

我希望将开源 3rdparty 库链接为 Linux 上动态加载的共享库。需要允许将其用作可选插件。它是适用于 C++ 库的 AWS-SDK,但对于问题和用作示例并不重要。我构建 .so 库并可以静态链接它并在我的代码中使用它们的 API。当我从链接命令中删除库依赖项并得到(如预期的那样):

GNU ld (GNU Binutils) 2.28
CMakeFiles/ed_core.dir/core/AmazonS3Client.cpp.o: In function `ed::amazons3client::(anonymous namespace)::AwsInit::AwsInit()':
  /devroot/develop/src/core/AmazonS3Client.cpp:61: undefined reference to `Aws::InitAPI(Aws::SDKOptions const&)'
  /devroot/develop/src/core/AmazonS3Client.cpp:62: undefined reference to `Aws::Utils::Logging::InitializeAWSLogging(std::shared_ptr<Aws::Utils::Logging::LogSystemInterface> const&)'
CMakeFiles/ed_core.dir/core/AmazonS3Client.cpp.o: In function `ed::amazons3client::(anonymous namespace)::AwsInit::~AwsInit()':
  /devroot/develop/src/core/AmazonS3Client.cpp:68: undefined reference to `Aws::Utils::Logging::ShutdownAWSLogging()'
  /devroot/develop/src/core/AmazonS3Client.cpp:69: undefined reference to `Aws::ShutdownAPI(Aws::SDKOptions const&)'
CMakeFiles/ed_core.dir/core/AmazonS3Client.cpp.o: In function `ed::amazons3client::MultipartSink::init[abi:cxx11]()':
  /devroot/develop/src/core/AmazonS3Client.cpp:550: undefined reference to `Aws::S3::Model::CreateMultipartUploadRequest::CreateMultipartUploadRequest()'
....
所以现在我需要手动编写导入模块,其中将通过 dlopen() 加载 .so,声明指向所需符号的指针,通过 dsym() 初始化此类符号,并通过 stub 将调用重定向到未定义函数的符号。
有什么不同的方法吗? LD 知道需要什么符号。 GCC 知道他们的声明。有没有办法即时连接或自动生成这样的导入模块?

最佳答案

使用 GNU 工具没有内置方法可以做到这一点,但是可以轻松地自动生成必要的样板代码(dlopendlsym 等)(参见例如 Implib.so project)。

关于c++ - 自动生成动态加载.so库的导入模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62606340/

相关文章:

C++ 保护 : fail to access base's protected member from within derived class

C - 在linux终端中打印希腊字母

c++ - 如何查询系统功能/属性?

c++ - 在 MASM 中调用 C++ 函数

c++ - 共享库 libbar.so 静态链接到 libfoo.a,程序链接到 libbar.so 和 libfoo.so,会发生什么?

c++ - 如何通过 QSignalMapper 或其他方式将 QString 从 QMenu 传递到 Qt 插槽

c++ - 在类中添加枚举定义会破坏其二进制向后兼容性吗?

linker - 如何强制 gcc 使用 newlibc 实现函数的自定义实现?

c++ - 如何使用 VS2015 获取语言环境名称?

mysql - phpmyadmin:无法登录