如何在这个项目中使用现代cmake

时间:2017-10-26 09:46:55

标签: c++ cmake

我有一段时间将现代cmake融入到我曾经工作过的项目中的一些问题,并且似乎一直困扰着我应该如何定义单个CMakeLists和顶级CMakeList。 / p>

我的项目结构非常简单。

├── build
└── src
    ├── include
    │   ├── database
    │   │   ├── database.cpp
    │   │   └── database.h
    │   ├── match
    │   │   ├── match.h
    │   │   └── mathc.cpp
    │   ├── record
    │   │   ├── lib
    │   │   ├── record.cpp
    │   │   └── record.h
    │   └── spectogram
    │       ├── spectogram.cpp
    │       └── spectrogram.h
    └── main.cpp

main.cpp链接到所有包含,并且一些包含应该知道其他包含的存在,这意味着,我应该能够包含match.h database.h。一些第三方库也将被使用,在这种情况下我使用portaudio,使用externalproject_add下载和安装,这只应该对包含库的包含可见,在这种情况下{{1} ,应该只看到这个。

但是我应该如何定义单个CMakeList,目前尚不清楚。

我已经在网上找到了正确的设置方法,但似乎找不到我理解的方法。

如何为此项目定义CMakeLists,以及如何确保包含,Main.cpp和包含需要它们的包含文件可见,以及如何仅显示第三方库对于它正在使用的包含。

尝试了CMakeLists示例结构: 的CMakeLists.txt

record

的src /包括/数据库/的CMakeLists.txt

cmake_minimum_required(VERSION 3.2)
project(soundcloud)
#add_subdirectory(src/database)
#add_subdirectory(src/match)
#add_subdirectory(src/record)
add_subdirectory(src/include/spectogram)

add_executable(cmakeDemo src/main.cpp)
SET_TARGET_PROPERTIES(cmakeDemo PROPERTIES LINKER_LANGUAGE Cxx)
target_link_libraries(cmakeDemo spectogram)
#target_link_libraries(cmakeDemo database match record spectogram)

收到错误消息:

add_library(spectogram STATIC .)
target_include_directories(spectogram PUBLIC .)

2 个答案:

答案 0 :(得分:1)

您可以使用target_include_directories的PRIVATE属性。当PRIVATE时,这意味着包含目录将可用于目标的源。当PUBLIC时,它也可用于指向目标的任何人。

如果我在一个CMakeLists.txt中写这个,我就这样做:

cmake_minimum_required(VERSION 3.0)

add_library(database STATIC src/include/database.cpp)
target_include_directories(database PUBLIC src/include/database)

################
add_library(match STATIC src/include/mathc.cpp)
target_include_directories(match PUBLIC src/include/match)

################
include(ExternalProject)
ExternalProject_Add(portAudio ${SomeCommands})

add_library(record STATIC src/include/record.cpp)
target_include_directories(record PUBLIC src/include/record)  # When cmakeDemo links to this, it'll get these includes
target_include_directories(record PRIVATE src/include/record/lib)   # When cmakeDemo links to this, it won't get these includes
target_link_libraries(record portAudio)

#################
add_library(spectogram STATIC src/include/spectogram.cpp)
target_include_directories(spectogram PUBLIC src/include/spectogram)

##################
add_executable(cmakeDemo src/main.cpp)
target_link_libraries(cmakeDemo database match record spectogram)

如果我使用分布式CMakeLists.txt执行此操作,我会拆分######行所在的文件,修复路径,并使用add_subdirectory()包含子目录来自更高级别的cmake文件。

答案 1 :(得分:0)

首先,你没有链接到包含,你只需在编译过程中“包含”它们。

有些人将一个CMakeList.txt放入包含相当独立的编译单元的每个目录中。

有些人只是在顶部使用一个大的。

只有一个CMakeList.txt文件可以让它更容易启动,但如果项目变得庞大,事情会变得混乱。

对于每个编译单元,您可以使用target_include_directories

指定包含目录