c++ - 项目A依赖共享库B,B依赖C,A不依赖C。当我使用B的API时,警告B找不到C
问题描述
一个项目A
依赖共享库B
,B
依赖C
,A
不依赖C
。B
被编译并安装为共享库。当A
使用 的 API 时,会出现无法找到B
的警告,如代码所示。B
C
在那个代码A
中是LibTest
. B
是TdLib
。C
是pangolin
。
Scanning dependencies of target LibTest
[ 50%] Building CXX object CMakeFiles/LibTest.dir/main.cpp.o
[100%] Linking CXX executable LibTest
/usr/bin/ld: warning: libpangolin.so, needed by /home/wang/CLionProjects/TdLibrary/install/lib/libTdLib.so, not found (try using -rpath or -rpath-link)
/home/wang/CLionProjects/TdLibrary/install/lib/libTdLib.so: 'pangolin::CreateDisplay()’ undefined reference
...
collect2: error: ld returned 1 exit status
CMakeFiles/LibTest.dir/build.make:84: recipe for target 'LibTest' failed
make[3]: *** [LibTest] Error 1
CMakeFiles/Makefile2:109: recipe for target 'CMakeFiles/LibTest.dir/all' failed
make[2]: *** [CMakeFiles/LibTest.dir/all] Error 2
CMakeFiles/Makefile2:121: recipe for target 'CMakeFiles/LibTest.dir/rule' failed
make[1]: *** [CMakeFiles/LibTest.dir/rule] Error 2
Makefile:131: recipe for target 'LibTest' failed
make: *** [LibTest] Error 2
CMakelist.txt
共享库的B
。
add_library(TdLib SHARED
pangolin_tools.cpp
pangolin_tools.h
)
#pangolin
find_package(Pangolin REQUIRED)
include_directories(${Pangolin_INCLUDE_DIRS} )
set(HEADER_FILES
pangolin_tools.h
)
set_target_properties(TdLib PROPERTIES
PUBLIC_HEADER
"${HEADER_FILES}"
)
target_link_libraries(TdLib PRIVATE
${Pangolin_LIBRARIES}
)
install(TARGETS TdLib
# IMPORTANT: Add the foo library to the "export-set"
EXPORT ${PROJECT_NAME}Targets
RUNTIME DESTINATION "${INSTALL_BIN_DIR}" COMPONENT bin
LIBRARY DESTINATION "${INSTALL_LIB_DIR}" COMPONENT shlib
PUBLIC_HEADER DESTINATION "${INSTALL_INCLUDE_DIR}/TdLibrary"
COMPONENT dev)
B
我安装
cmake .. -DCMAKE_INSTALL_PREFIX:=/home/wang/CLionProjects/TdLibrary/install
make
make install
CMakelist.txt
项目的A
。
cmake_minimum_required(VERSION 3.9)
project(LibTest)
set(CMAKE_CXX_STANDARD 11)
#TdLib
set(TdLib_DIR "/home/wang/CLionProjects/TdLibrary/install/lib/CMake/TdLib/")
find_package(TdLib REQUIRED)
include_directories(${TdLib_INCLUDE_DIRS})
add_executable(LibTest main.cpp)
target_link_libraries(LibTest ${TdLib_LIBRARIES}
解决方案
您肯定会链接到共享库。
在下文中,我将删除PRIVATE
关键字:
target_link_libraries(TdLib PRIVATE
${Pangolin_LIBRARIES}
)
看看这是否有帮助。就我而言,我注意到您可以在没有任何链接的情况下链接库target_link_libraries()
,然后强制您在构建可执行文件时添加库。
我也猜想这个PRIVATE
关键字可能不会完全按照你的想法做。
推荐阅读
- mule - Mule 4:批处理:批处理步骤中的接受表达式错误
- python - 如何使用字典获取随机值以关联范围
- python - 空服务 Ros Python
- windows - 批处理脚本读取文件的数字部分并用下一个更高的整数重命名
- flutter - 更新 Hive 框中最喜欢的字段的布尔值
- javascript - JSGrid - 页面更改后更改单元格值(onPageChanged 方法)不起作用
- list - 如何计算haskell中的百分比增长
- android - 语音识别:做什么,当我说“写”,但识别是“正确的”。一个应用程序,用 Kotlin 编写
- c# - 模型关系会导致 Swagger/端点出现问题
- node.js - 部署到heroku时反应路由器不起作用