CMake 单一构建时库链接不起作用

Library linking not working when CMake single build

使用 CMake 我想在每个目录 A、B 和 C 中构建。

项目结构如下:

.
├── A
│   ├── CMakeLists.txt
│   └── src
│       └── a.cpp
├── B
│   ├── CMakeLists.txt
│   └── src
│       └── b.cpp
├── common
│   ├── CMakeLists.txt
│   ├── include
│   │   ├── common.h
│   └── src
│       └── common.cpp
└── C
    ├── CMakeLists.txt
    └── src
        └── c.cpp

在Common目录下创建库并安装创建的库。

common/CmakeLists.txt :

set(COMMON_LIB_NAME CommonTemp)
set(SRC_CODE
${CMAKE_CURRENT_SOURCE_DIR}/include/common.h
    ${CMAKE_CURRENT_SOURCE_DIR}/src/common.cpp
)

add_library (${COMMON_LIB_NAME} SHARED ${SRC_CODE})

install(TARGETS ${COMMON_LIB_NAME} DESTINATION ~/tempDir/lib)

我想link生成的库到目录A。 a.cpp 需要 common.h.

A/CMakeLists.txt:

ADD_EXECUTABLE(ServiceA src/a.cpp)

target_include_directories (
    ServiceA PUBLIC
    include
)

target_sources (
    ServiceA PRIVATE
    src/a.cpp
)

target_link_libraries(
    ServiceA PUBLIC
    ${COMMON_LIB_NAME} #### Location considered to be a problem
)

install(TARGETS ServiceA DESTINATION ~/tempDir/bin/A)

出现一条错误消息,指出无法包含 common.h。

我的猜测是${COMMON_LIB_NAME}变量定义在另一个目录的CMakeLists.txt中,所以预计不能linked。 但即使我输入 CommonTemp ,变量的值,它也说找不到 common.h。

即使我在每个目录中单独构建 CMake,我如何 link 库 links?

在common/CmakeLists.txt.

您需要在 target_include_directores 中包含 headers。

target_include_directories(
        ${COMMON_LIB_NAME} PUBLIC
        ${CMAKE_CURRENT_SOURCE_DIR}/include
    )

不用在add_library

中提及

在 A/CMakeLists.txt 中。包含路径不正确。

target_include_directories(
    ServiceA PUBLIC
    ${CMAKE_CURRENT_SOURCE_DIR}/<path to common>/include
)

要链接库,您必须提供正确的库路径,否则会失败

target_link_libraries(
    ServiceA PUBLIC
    ${COMMON_LIB_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/<path to tempDir>/lib
)