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
)
使用 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
)