【问题标题】:CMAKE: Build executable and library and link themCMAKE:构建可执行文件和库并链接它们
【发布时间】:2019-07-30 03:16:43
【问题描述】:

我使用 CMake 进行构建并希望保持我的项目灵活和简洁,因此我决定将代码文件分组到单独的文件夹中。 但是在src 文件夹中,我有带有代码的子文件夹,我想将它们分开到库中。我在我想要编译代码的地方创建了CMakeLists.txt,但是 CMake 抛出了错误。

我已阅读 this 问题和答案没有帮助。 我想我在其他地方搞砸了(或者解决方案有点过时)

这是我的目录树:

uint32-sort/
├── build
├── CMakeLists.txt           $1 // Main build file, for whole project
├── include                     // Headers folder
│   ├── file_manager.hpp
│   └── sort_container.hpp
└── src                         // Source folder
    ├── main.cpp        
    └── sort_lib                // Lib source folder
    ├── CMakeLists.txt       $2 // Build file for lib
        ├── file_manager.cpp
        └── sort_container.cpp

CMakeLists.txt $1 :

cmake_minimum_required(VERSION 3.15)

SET(PROJECT_NAME "Uint32Sort")
project(${PROJECT_NAME} VERSION 0.01 LANGUAGES CXX)


include_directories(${PROJECT_SOURCE_DIR}/include ${PROJECT_SOURCE_DIR}/src)
add_executable(uint32sort main.cpp)
add_subdirectory(${PROJECT_SOURCE_DIR}/src/sort_lib/)


target_link_libraries(${PROJECT_NAME} SortCore)

set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 11 CXX_STANDARD_REQUIRED ON)

CMakeLists.txt $2:

cmake_minimum_required(VERSION 3.1.0)

SET(PROJECT_NAME "SortCore")
project(${PROJECT_NAME} VERSION 0.01 LANGUAGES CXX)

include_directories(${PROJECT_SOURCE_DIR}/../../include ${PROJECT_SOURCE_DIR})

file(GLOB SRC_LIB_FILES *.cpp)

add_library(${PROJECT_NAME} ${SRC_LIB_FILES})
target_link_libraries(${PROJECT_NAME} openmp)

set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 11 CXX_STANDARD_REQUIRED ON)

我希望在uint32-sort/build 文件夹中运行cmake .. 并获得与来自uint32-sort/src/sort_lib/ 的库链接的可执行文件,但我得到的都是这个错误:

CMake Error at CMakeLists.txt:12 (target_link_libraries):
  Cannot specify link libraries for target "Uint32Sort" which is not built by
  this project.

【问题讨论】:

    标签: c++ cmake


    【解决方案1】:

    正如错误所说:您没有名为Uint32Sort 的目标。但是,您有一个名为 uint32sort 的目标:

    #              v---------- executable target
    add_executable(uint32sort main.cpp)
    

    所以你的target_link_libraries 调用应该使用目标作为它的第一个参数:

    # use PRIVATE of no public header use SortCore
    target_link_libraries(uint32sort PUBLIC SortCore)
    

    【讨论】:

    • 感谢您的回答!现在一切正常(在我纠正了一些额外的错误之后)。
    • 我建议你寻找基于目标的cmake API。它确实有助于组织具有外部依赖关系的大型项目
    • @nonForgivingJesus here's a documentation link
    • 顺便问一下,除了文档,你知道关于 cmake 的好书吗?文档很好,然后您就知道自己想要什么。但我是这里的初学者,并不总是知道我想要什么。我找到了this one,但它已经有 2 年历史了,并且 cmake 从 2017 年开始升级......
    • @nonForgivingJesus 不幸的是,没有。我通过尝试创建我能做到的最佳设置并通过查看高质量库如何做到这一点来学习它。 It's Time To Do CMake Right 之类的博文也对我很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 2010-12-07
    • 2021-06-16
    相关资源
    最近更新 更多