【问题标题】:C++: Linking to two versions of opencv. How can I tell the linker to pick a specific verionC++:链接到两个版本的 opencv。如何告诉链接器选择特定的版本
【发布时间】:2020-11-18 10:54:31
【问题描述】:

说明

我有以下问题:

  • 我正在开发库 libmy_code.so

  • 我需要链接到一个封闭的源代码库 libclosed_source.so 我无法控制

  • libclosed_source.so 静态链接到 opencv 3.2.0

  • libclosed_source.so 已导出 all 符号(还有那些我不想要的来自 opencv 3.2.0 的符号)

  • 我的库 libmy_code.so 也需要更新版本的 opencv 3.4.11

  • 我使用 CMake 作为构建系统

见下图



                                           +-------------+
                                      +--->|libmy_code.so+<-------+
                                      |    +-------------+        |
                                      |                           |
                    Statically linked |                           |dynamically linked
                                      |                           |
                                      |                           |
                                      |                           |
                                      |                           |
                                      |                   +-------+-----------+
                                      |                   |libclosed_source.so|
                                      |                   +-------------------+
                                      |                           ^
                                      |                           | Statically linked
                                      |                           |
                                  +---+---------+           +-----+------+
                                  |OpenCV 3.4.11|           |Opencv 3.2.0|
                                  +-------------+           +------------+

问题

  • 我的库 libmy_code.so 使用 cv::resize。 CMake 构建系统在 OpenCV 3.4.11 的标头中正确定位 cv::resize(我使用 find_package(OpenCV) 并将其指向 opencv 3.4.11 安装)。

  • 但是,链接器将 cv::resize 链接到 libclosed_source.so(静态包含 cv::resize 的 Opencv3.2.0 版本)。

  • 我的构建系统在一个绝对没有 opencv 3.2.0 的 docker 容器中运行。

  • 我找到的最接近的问题是this

如何告诉链接器不要将 opencv 函数 libmy_code.so 链接到 libclosed_source.so 而是直接链接到 Opencv 3.4.11 ??

【问题讨论】:

标签: c++ opencv linker


【解决方案1】:

解决方案

我对该问题的解决方案是使用 RTLD_DEEPBIND|RTLD_LOCAL 将每个 dlopen 动态加载 libclosed_source.so 到 libmy_code.so 中。这样libmy_code.so可以使用opencv 3.4.11,而libclosed_source.so仍然可以使用opencv 3.2.0。

与 libmy_code.so 链接的可执行文件必须使用 -fPIC 进行编译,以防止 libstdc++ 出现问题,更多的是 Weird interaction of RTLD_DEEPBIND, Position independent Code (PIC) and C++ STL (std::cout)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 2015-09-17
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多