c++ - 我想澄清如何正确连接共享库
问题描述
让我们举一个真实的例子——我有两个原生的 android lib 模块(CMake
)。第一个模块名称是 - libtetdecoder
(这里进一步 - A),另一个是 - libtetplayer
(进一步这里 - B)。所以,lib A 使用opencv
和 lib B 使用 lib A。那么,opencv 是共享库,这意味着为了使其在 lib AI 中工作,需要包含头文件以及 .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 BCMakeList.txt
并删除 opencv 配置行,它就不起作用。
所以,问题是 - 如果我真的需要在所有派生库中包含这个 opencv 依赖项?
解决方案
如果您通过target_link_libraries
链接将它们全部链接起来PUBLIC
,则依赖项应该是可传递的,请看这里。
目录结构:
- 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 应该弄清楚。首先,确保find_package
在引用 OpenCV 之前调用。我相信你可以坚持下去,target_link_libraries
而不必改变PROPERTIES
你做事的方式。在引擎盖下,我相信这target_link_libraries
也会修改一些属性,但我相信这样会更清楚。
推荐阅读
- python-3.x - Turbogears2:应用程序未作为子包启动
- c++ - SIGNALSEGV (segmentation fault) out of vector pushback方法
- android - 如何根据墓碑中apk中的偏移量找到有问题的库
- javascript - JavaScript 中的策略或工具/库在保持顺序的同时交换 JSON 对象中的特定属性?
- mongodb - 如何根据嵌套在mongodb中另一个对象数组中的数组中的元素删除整个对象?
- push-notification - Ejabberd:即使在线也能推送通知
- algorithm - 从 2D 网格中移除墙时的最短路径优化
- r - 如何在下面的代码中添加“repel = TRUE”以使 PCA 更具可读性?
- javascript - Angular中的交叉点观察者
- arrays - Perl - 如何匹配数百万个耦合字符串?