[英]C++: Linking to two versions of opencv. How can I tell the linker to pick a specific verion
I have the following problem:我有以下问题:
I am developing the library libmy_code.so我正在开发库 libmy_code.so
I need to link against a closed source library libclosed_source.so over which I have no control我需要链接一个我无法控制的封闭源库 libclosed_source.so
libclosed_source.so is statically linked against opencv 3.2.0 libclosed_source.so 与 opencv 3.2.0静态链接
libclosed_source.so has exported all symbols (also those from opencv 3.2.0 which I do not want) libclosed_source.so 已导出所有符号(还有我不想要的来自 opencv 3.2.0 的符号)
My library libmy_code.so also needs the newer version opencv 3.4.11我的库 libmy_code.so 也需要更新版本的 opencv 3.4.11
I use CMake as the build system我使用 CMake 作为构建系统
See the following diagram见下图
+-------------+
+--->|libmy_code.so+<-------+
| +-------------+ |
| |
Statically linked | |dynamically linked
| |
| |
| |
| |
| +-------+-----------+
| |libclosed_source.so|
| +-------------------+
| ^
| | Statically linked
| |
+---+---------+ +-----+------+
|OpenCV 3.4.11| |Opencv 3.2.0|
+-------------+ +------------+
My library libmy_code.so uses cv::resize.我的库 libmy_code.so 使用 cv::resize。 The CMake build system correctly locates cv::resize in the headers of OpenCV 3.4.11 (I use find_package(OpenCV) and point it to the opencv 3.4.11 install).
CMake 构建系统在 OpenCV 3.4.11 的头文件中正确定位 cv::resize (我使用 find_package(OpenCV) 并将其指向 opencv 3.4.11 安装)。
However the linker links cv::resize to libclosed_source.so (which contains the Opencv3.2.0 version of cv::resize statically).然而,链接器将 cv::resize 链接到 libclosed_source.so(其中静态包含 cv::resize 的 Opencv3.2.0 版本)。
My build system runs in a docker container which definitely does not have opencv 3.2.0.我的构建系统在 docker 容器中运行,该容器绝对没有 opencv 3.2.0。
How can I tell the linker not to linker opencv functions libmy_code.so to libclosed_source.so but directly to Opencv 3.4.11 ??如何告诉链接器不要将 opencv 函数 libmy_code.so 链接到 libclosed_source.so 而是直接链接到 Opencv 3.4.11 ??
My solution to the problem is to load libclosed_source.so dynamically per dlopen with RTLD_DEEPBIND|RTLD_LOCAL into libmy_code.so.我对这个问题的解决方案是使用 RTLD_DEEPBIND|RTLD_LOCAL 每个 dlopen 将 libclosed_source.so 动态加载到 libmy_code.so 中。 This way libmy_code.so can use opencv 3.4.11 and libclosed_source.so can still use opencv 3.2.0.
这样 libmy_code.so 可以使用 opencv 3.4.11,libclosed_source.so 仍然可以使用 opencv 3.2.0。
The executable that was linked against libmy_code.so had to be compiled with -fPIC to prevent problems with libstdc++, more to that in Weird interaction of RTLD_DEEPBIND, Position independent Code (PIC) and C++ STL (std::cout)与 libmy_code.so 链接的可执行文件必须使用 -fPIC 进行编译以防止 libstdc++ 出现问题,更多的是 RTLD_DEEPBIND、位置无关代码 (PIC) 和 C++ STL (std::cout) 的奇怪交互
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.