我有一段时间将现代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 .)
答案 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
指定包含目录