我希望将开源 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 工具没有内置方法可以做到这一点,但是可以轻松地自动生成必要的样板代码(dlopen
、dlsym
等)(参见例如 Implib.so project)。
关于c++ - 自动生成动态加载.so库的导入模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62606340/