【问题标题】:I would like to clarify how to connect shared libs properly我想澄清如何正确连接共享库
【发布时间】:2020-09-15 13:37:14
【问题描述】:

让我们举一个真实的例子 - 我有两个原生的 android lib 模块 (CMake)。第一个模块名称是 - libtetdecoder(此处进一步 - A),另一个是 - libtetplayer(此处进一步 - B)。因此,lib A 使用 opencv,而 lib B 使用 lib A。那么,opencv 是共享库,这意味着为了使其在 lib A 中工作,我需要包含头文件以及 .so 文件。

我在CMakeList.txt 这样做

...
include_directories(${pathToOpenCv}/sdk/native/jni/include)
add_library(lib_opencv SHARED IMPORTED)
set_target_properties(lib_opencv PROPERTIES IMPORTED_LOCATION
        ${pathToOpenCv}/sdk/native/libs/${CMAKE_ANDROID_ARCH_ABI}/libopencv_java3.so)
...

正如我在上面所说的 lib B 使用 lib A(但不是 opencv),所以链看起来像这样B -> A -> opencv(shared)。问题是 - 如果在这种情况下我需要在 lib B 中包含 opencv 配置(CMake)?因为据我了解lib B是否要使用lib A,所以这意味着lib B应该实现与lib A相同的所有依赖项。

我为什么要问,因为今天我在 lib A 和 B 中都有这个实现,如果我尝试清理 lib B CMakeList.txt 并删除 opencv 配置行它不起作用。

所以,问题是 - 如果我真的需要在所有衍生库中包含这个 opencv 依赖项?

【问题讨论】:

  • 我相信答案是“是”,因为此调用执行了特定库实例本地的一些幕后初始化。在编程系统中遇到这种事情是相当普遍的。所以——“如果它有效,那就去做吧。”

标签: c++ dll shared-libraries


【解决方案1】:

如果您通过target_link_libraries 链接它们并链接它们PUBLICly,则依赖项应该是可传递的,请看这里。

目录结构:

- src
-- CMakeLists.txt
-- ecu.cpp
-- engine_ecu.cpp
-- ...
- test
-- CMakeLists.txt
-- integration_test.cpp

src/CMakeLists.txt:

project(EngineController)

add_library(Lib1 SHARED
    ecu.cpp
)

add_library(Lib2 SHARED
    engine_ecu.cpp
    load_detector.cpp
    math_helper.cpp
    temperature_sensor.cpp
)

target_link_libraries(Lib1
    PUBLIC
        EngineControllerApi
)

target_link_libraries(Lib2
    PUBLIC
        EngineControllerApi
        Lib1
)

测试/CMakeLists.txt:

project(EngineControllerTest)

add_executable(${PROJECT_NAME}
    integration_test.cpp
)

target_link_libraries(${PROJECT_NAME}
    PUBLIC
        Lib2
)

产生以下结果:

-- Build files have been written to: /diaggen/example/engine_controller/build
[ 11%] Building CXX object src/CMakeFiles/Lib1.dir/ecu.cpp.o
[ 22%] Linking CXX shared library libLib1.so
[ 22%] Built target Lib1
[ 33%] Building CXX object src/CMakeFiles/Lib2.dir/engine_ecu.cpp.o
[ 44%] Building CXX object src/CMakeFiles/Lib2.dir/load_detector.cpp.o
[ 55%] Building CXX object src/CMakeFiles/Lib2.dir/math_helper.cpp.o
[ 66%] Building CXX object src/CMakeFiles/Lib2.dir/temperature_sensor.cpp.o
[ 77%] Linking CXX shared library libLib2.so
[ 77%] Built target Lib2
[ 88%] Building CXX object test/CMakeFiles/EngineControllerTest.dir/integration_test.cpp.o
[100%] Linking CXX executable EngineControllerTest
[100%] Built target EngineControllerTest

我相信 CMake 应该解决这个问题。首先,确保在引用 OpenCV 之前调用 find_package。我相信您可以坚持使用target_link_libraries,而不必像您那样改变PROPERTIES。在幕后,我相信target_link_libraries 也修改了一些属性,但我相信这样会更清楚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2018-07-30
    • 2018-05-30
    • 2020-07-15
    相关资源
    最近更新 更多