【发布时间】:2018-04-07 15:28:51
【问题描述】:
一段时间以来,我在将现代 cmake 整合到我一直在工作的项目中时遇到了一些问题,并且似乎被困在如何定义单个 CMakeList 和顶级 CMakeList 上。
我的项目结构非常简单。
├── 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 下载和安装,它应该只对包含库的包含可见,在这种情况下 record,应该只看到这个。
但我应该如何定义单个 CMakeList,目前尚不清楚。
我已经在网上搜寻了一种正确的设置方法,但似乎找不到我理解的方法。
如何为该项目定义 CMakeLists,如何确保包含对 Main.cpp 和需要它们的包含文件可见,以及如何使第三方库仅可见用于包含它的内容。
CMakeLists 示例结构尝试: 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)
src/include/database/CMakeLists.txt
add_library(spectogram STATIC .)
target_include_directories(spectogram PUBLIC .)
收到错误消息:
CMake Error: Error required internal CMake variable not set, cmake may not be built correctly.
Missing variable is:
CMAKE_Cxx_LINK_EXECUTABLE
CMake Error: Cannot determine link language for target "spectogram".
CMake Error: CMake can not determine linker language for target: spectogram
【问题讨论】:
-
我会说你的项目结构相当复杂。为什么你在彼此内部有包含和 src 文件夹?为每个标题和类设置单独的文件夹有什么意义?所有这些文件之间的实际关系是什么?也许根据它们之间的关系重新组织它们会更好,即对应于源代码的命名空间结构?
-
你是对的.. include 文件夹中的 include 和 src 是多余的...我删除了它们..
-
也许这个SO question可以帮助你。
-
嗯...我不确定是否理解我将如何构建这个项目.. include 中的每个文件夹实际上是一个有自己用途的模块。我将首先开发每个子模块,然后将它们放在一起。这需要仅制作单个子模块的可能性。我正在尝试构建它..