为何CMake未将libB、libC的PUBLIC包含目录传递给libA?
问题原因及解决方案
你的问题根源在于错误使用target_link_directories处理项目内库的依赖,导致CMake未建立libA与libB、libC的依赖关系,无法继承它们的PUBLIC包含目录。
具体原因
target_link_directories仅负责告诉CMake链接阶段去哪里查找库文件,不处理目标间的依赖传递逻辑。只有通过target_link_libraries链接CMake目标时,才会自动传递目标的PUBLIC/INTERFACE属性(包括include目录、编译定义、链接选项等)。
修复方案
修改libA的CMakeLists.txt,将target_link_directories替换为target_link_libraries:
add_library(libA SHARED inc/libA.h inc/libAExport.h src/libA.cpp ) target_include_directories(libA PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/inc PUBLIC ${SHARED_PATH}/inc ) # 替换原target_link_directories,直接链接项目内的库目标 target_link_libraries(libA PUBLIC libB libC) target_compile_definitions(libA PRIVATE LIBA_DLL)
为什么这样有效
当用target_link_libraries将libB和libC以PUBLIC方式链接到libA时,CMake会自动把libB、libC的PUBLIC包含目录、INTERFACE属性等传递给libA,libA编译时就能正确找到libB.h和libC.h了。
对于本项目内由CMake生成的库目标,无需额外指定链接目录,CMake会自动管理这些路径。target_link_directories更适合指定外部第三方库的路径,而非项目内的依赖目标。
内容的提问来源于stack exchange,提问作者TonySalimi
相关产品推荐
相关产品推荐

