cmake:构建可执行文件并库并链接它们

CMAKE: Build executable and library and link them

本文关键字:链接 cmake 构建 可执行文件      更新时间:2023-10-16

我使用cmake进行构建,并希望保持我的项目灵活和合成,因此我决定将代码文件分组为单独的文件夹。但是在src文件夹中,我有一个子文件夹,其中有代码,我希望将我分开到库中。我制作了CMakeLists.txt,我希望代码编译,但是CMAKE会引发错误。

我已经阅读了这个问题,答案无济于事。我想我在其他地方搞砸了(或解决方案有点过时(

这是我的目录树:

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.

正如错误所说:您没有名为 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)