一个项目A依赖共享库B,B依赖C,A不依赖C,为什么我需要在CMakelist.txt的A中find_package和targe_link C?



一个项目A依赖共享库B,B依赖第三方库C,A不依赖C,为什么我需要在CMakelist.txt的A中find_package C?第三方库 C 是 PCL。

共享库 B 的 CMakelist.txt。

add_library(TdLib SHARED
pcl_tools.cpp
pcl_tools.h
)
#PCL
find_package(PCL 1.8 REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
set(HEADER_FILES
pcl_tools.h
)
set_target_properties(TdLib PROPERTIES
PUBLIC_HEADER
"${HEADER_FILES}"
)
target_link_libraries(TdLib
${PCL_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

项目A的CMakelist.txt。

cmake_minimum_required(VERSION 3.9)
project(Test)
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})
MESSAGE(STATUS "TdLib_INCLUDE_DIRS = " ${TdLib_INCLUDE_DIRS})
#PCL
find_package(PCL 1.8 REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_executable(openMpTest main.cpp)
target_link_libraries(openMpTest
${TdLib_LIBRARIES}
)

如果我注释代码find_package(PCL 1.8 REQUIRED), 错误将发生如下:

Scanning dependencies of target openMpTest
[ 50%] Building CXX object CMakeFiles/Test.dir/main.cpp.o
[100%] Linking CXX executable Test
/usr/bin/ld: Cannot find -lvtkChartsCore
/usr/bin/ld: Cannot find -lvtkCommonColor
/usr/bin/ld: Cannot find -lvtkCommonDataModel
...
...
collect2: error: ld returned 1 exit status
CMakeFiles/Test.dir/build.make:117: recipe for target 'Test' failed
make[2]: *** [Test] Error 1
CMakeFiles/Makefile2:72: recipe for target 'CMakeFiles/Test.dir/all' failed
make[1]: *** [CMakeFiles/Test.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

对 B 的 CMakelist.txt 的修改:

target_link_libraries(TdLib PRIVATE
${PCL_LIBRARIES}
)

PRIVATE 选项表示依赖项仅由 B 使用。依赖 B 的 A 不需要find_package(C(。

最新更新