如何解决我想澄清一下如何正确连接共享库
让我们举一个真实的例子-我有两个本地android lib模块(CMake
)。第一个模块名称是-libtetdecoder
(在这里-A),另一个是-libtetplayer
(在这里-B)。因此,lib A使用opencv
,而lib B使用libA。然后,opencv是共享lib,这意味着要使其在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 B CMakeList.txt
并删除opencv config行,它将无法正常工作。
所以,问题是-我是否真的需要在所有派生库中包括这个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
)
test / 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
也会修改某些PROPERTIES,但是我认为这种方式要清晰得多。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。