简体   繁体   English

C++:链接到两个版本的 opencv。 如何告诉链接器选择特定版本

[英]C++: Linking to two versions of opencv. How can I tell the linker to pick a specific verion

Description描述

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|
                                  +-------------+           +------------+

Problem问题

  • 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。

  • The closest question I have found is this我发现的最接近的问题是这个

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 ??

Solution解决方案

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM