【问题标题】:CMake target with sibling folders带有兄弟文件夹的 CMake 目标
【发布时间】:2020-05-10 08:22:43
【问题描述】:

我的项目结构如下:

root
-CMakeLists.txt
----exec
-----CMakeLists.txt
-----src
------a.cpp
------a.h
----lib
-----CMakeLists.txt
-----src
------b.cpp
-----inc
------b.h

执行目标取决于lib 目标。我的主要 CMakeLists.txt 如下:

cmake_minimum_required(VERSION 2.8)
cmake_policy(SET CMP0048 NEW)
project(FOO CXX)
add_subdirectory(lib)
add_subdirectory(exec)

在库的 CMakeLists.txt 中,我使用 add_library() 并在 exec 文件夹中使用 add_executable()。问题是可执行文件找不到库,我不知道如何在 exec CMakeLists.txt 中说存在另一个名为 lib 的目标,这是一个要使用的库。我想我在项目配置中遗漏了一些东西。

Lib CmakeLists.txt

cmake_minimum_required(VERSION 2.8)

cmake_policy(SET CMP0048 NEW)
project(BASIC CXX)

add_library(BASIC src/b.cpp)

set(HEADERS_FILE_DIRS inc)

include_directories(${HEADERS_FILE_DIRS})

#Linking
target_link_libraries(BASIC pthread)

执行 CMakeLists.txt

cmake_minimum_required(VERSION 2.8)

cmake_policy(SET CMP0048 NEW)
project(EXEC CXX)

add_executable(EXEC src/a.cpp)

set(HEADERS_FILE_DIRS src ${CMAKE_CURRENT_SOURCE_DIR}/../lib/inc)

include_directories(${HEADERS_FILE_DIRS})

set_target_properties(EXEC PROPERTIES OUTPUT_NAME "EXEC")

find_library(BASIC_LIBRARY BASIC HINTS <ABS PATH HERE>/lib)
#Linking
target_link_libraries(EXEC pthread ${BASIC_LIBRARY})

【问题讨论】:

  • 附加 lib/CMakeLists.txt 和 exec/CMakeLists.txt
  • 显示代码而不是描述它。
  • 我添加了所需的信息
  • 删除 find_library 行并使用 target_link_libraries(EXEC BASIC)

标签: c++ cmake


【解决方案1】:

正如评论,您可以简单地链接BASIC CMake 库目标。因为它是在same CMake 调用中较早创建的,所以CMake 已经知道它的存在并将正确链接它。

此外,(如果您可以将 CMake 升级到至少 2.8.11)您可以使用target_include_directorieslib/inc 包含目录直接 应用到您的BASIC 库目标。在此处使用 PUBLIC 范围参数将这些包含目录传播到使用 CMake 目标。这样,您就可以避免在您的exec/CMakeLists.txt 文件中完全提及lib/inc 目录:

lib/CMakeLists.txt:

cmake_minimum_required(VERSION 2.8)

cmake_policy(SET CMP0048 NEW)
project(BASIC CXX)

add_library(BASIC src/b.cpp)

set(HEADERS_FILE_DIRS inc)

# Assign this include directory to the target as a build AND usage requirement.
target_include_directories(BASIC PUBLIC ${HEADERS_FILE_DIRS})

# Linking
target_link_libraries(BASIC PUBLIC pthread)

exec/CMakeLists.txt:

cmake_minimum_required(VERSION 2.8)

cmake_policy(SET CMP0048 NEW)
project(EXEC CXX)

add_executable(EXEC src/a.cpp)

set(HEADERS_FILE_DIRS src)

include_directories(${HEADERS_FILE_DIRS})

set_target_properties(EXEC PROPERTIES OUTPUT_NAME "EXEC")

# Linking BASIC to EXEC, which propagates the 'lib/inc' include directory
# and the 'pthread' library linkage to EXEC also.
target_link_libraries(EXEC PRIVATE BASIC)

【讨论】:

    猜你喜欢
    • 2012-10-31
    • 2015-11-05
    • 1970-01-01
    • 2015-03-22
    • 2021-12-19
    • 1970-01-01
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多