CMake提供了几种指定目标源文件的方法.一种是使用globbing(文档),例如:
FILE(GLOB MY_SRCS dir/*)
Run Code Online (Sandbox Code Playgroud)
另一个是单独指定每个文件.
哪种方式更喜欢?Globbing似乎很容易,但我听说它有一些缺点.
不知何故,我对CMake的工作原理感到困惑.每当我认为我越来越了解CMake是如何写的时候,它就会在我读到的下一个例子中消失.我想知道的是,我应该如何构建我的项目,以便我的CMake在将来需要最少的维护.例如,当我在src树中添加一个新文件夹时,我不想更新我的CMakeList.txt,这与所有其他src文件夹完全一样.
这就是我想象我的项目结构的方式,但请这只是一个例子.如果推荐的方式不同,请告诉我,告诉我该怎么做.
myProject
src/
module1/
module1.h
module1.cpp
module2/
[...]
main.cpp
test/
test1.cpp
resources/
file.png
bin
[execute cmake ..]
Run Code Online (Sandbox Code Playgroud)
顺便说一下,我的程序知道资源在哪里是很重要的.我想知道推荐的资源管理方式.我不想用"../resources/file.png"访问我的资源
我已经环顾四周(StackOverflow等),我正在尝试使用cmake生成Visual Studio过滤器.我有以下文件夹:
src/math
src/import
src/ui
我想生成如上所述的过滤器.
"math":包含src/math
"import"中的所有cpp&h文件
:包含src/import "ui"中的所有cpp&h文件:包含src/ui中的所有cpp&h文件
我尝试了几种解决方案,但似乎都没有工作!
这是CMakeList.txt中代码的最后一个版本:
src/math
src/import
src/ui
Run Code Online (Sandbox Code Playgroud)
欢迎任何帮助!
我有以下结构
Main (dir)
+-- CMakeLists.txt
+-- File.cpp
+-- File.hpp
+-- Dir (dir)
+-- CMakeLists.txt
+-- File1.cpp
+-- File1.hpp
+-- File2.cpp
+-- File2.hpp
Run Code Online (Sandbox Code Playgroud)
主/的CMakeLists.txt
CMAKE_MINIMUM_REQUIRED (VERSION 2.8.11)
PROJECT(Main)
FILE(GLOB SOURCE
"*.hpp"
"*.cpp"
)
ADD_SUBDIRECTORY(Dir)
ADD_EXECUTABLE(Main ${SOURCE})
Run Code Online (Sandbox Code Playgroud)
主/ DIR /的CMakeLists.txt
FILE(GLOB LOCAL_SOURCE
"*.hpp"
"*.cpp"
)
SET(SOURCE
${SOURCE}
${LOCAL_SOURCE}
PARENT_SCOPE
)
Run Code Online (Sandbox Code Playgroud)
它在Visual Studio中生成以下结构

我想要的是:

我尝试了什么:
主/的CMakeLists.txt
CMAKE_MINIMUM_REQUIRED (VERSION 2.8.11)
PROJECT(Main)
FILE(GLOB LOCAL_SOURCE
"*.hpp"
"*.cpp"
)
SET(SOURCE
${LOCAL_SOURCE}
)
ADD_SUBDIRECTORY(Dir)
SOURCE_GROUP(Main FILES ${LOCAL_SOURCE})
ADD_EXECUTABLE(Main ${SOURCE})
Run Code Online (Sandbox Code Playgroud)
主/ DIR /的CMakeLists.txt
FILE(GLOB LOCAL_SOURCE
"*.hpp"
"*.cpp"
)
SET(SOURCE …Run Code Online (Sandbox Code Playgroud) 我正在开发一个模拟项目:从目标平台获取嵌入式C代码库,并尝试在主机上模拟它以进行调试或单步执行代码.
操作系统:Ubuntu Linux 14.04,IDE:CodeLite,Makefile Generator:Cmake.我对如何为项目编写CMakeLists.txt感到困惑.以下是代码库的结构(它全部用C语言编写):
|ARQSim\
|-->ARQSim.h
|-->ARQSim.c
|-->BaseStationCode\
| |->downlink.c
| |->neoncopy.c
| |->armCore\
| | |->common\
| | | |->Bsconfig.h
| | | |->config.h
| | |->MacSource\
| | | |->lib\
| | | | |->arqCommon.h
| | | | |->OverTheAir.h
| | | |->source\
| | | | |->beacon.c
| | | | |->proxyDhcp.c
| | | | |->ARQ\
| | | | | |->arqCommon.c
| | | | …Run Code Online (Sandbox Code Playgroud) 我刚看过这个:
答案表明文件为glob,例如:
file(GLOB "*.h" "*.cpp")
Run Code Online (Sandbox Code Playgroud)
现在,如果我希望我的目标依赖于特定文件夹下某种类型的所有文件 - 可能在多个子文件夹中,该怎么办?我试过用
execute_process(COMMAND find src/baz/ -name "*.cpp" OUTPUT_VARIABLE BAR)
Run Code Online (Sandbox Code Playgroud)
然后
add_executable(foo ${BAR}
Run Code Online (Sandbox Code Playgroud)
但这给了我错误:
找不到源文件:
src/baz/some/file/here
src/baz/some/other_file/here
src/baz/some/other_file/here2
Run Code Online (Sandbox Code Playgroud)
(是的,有那个间距.)
我在这做错了什么?
总是当我添加一个新的 C++ 文件时,Android Studio 会通知我该文件不是我项目的一部分,我应该将新文件包含在适当的构建文件(build.gradle、CMakeLists.txt、Android.mk 等)中。 )。
我总是手动点击“Refresh Linked C++-Projects”来让 Android Studio 在项目中包含我的新 C++-File。
我正在使用 Cmake 并通过file(GLOB CPP_FILES "src/main/cpp/*.cpp")CMakeLists.txt 中的行将我的 C++ 文件 glob 化。
如果添加了新的 Cpp-File,如何让 Android Studio 自动刷新喜欢的 C++-Project?
提前致谢!
根据为什么 cmake 文件 GLOB 是邪恶的?,使用 glob 作为目标源是一种不好的做法。我试图产生所描述的情况。
CMakeLists.txt
file(GLOB SOURCES "src/*.cpp")
add_executable(main "${SOURCES}")
Run Code Online (Sandbox Code Playgroud)
src/main.cpp
#include <iostream>
int main() {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我跑cmake一次。之后,我创建一个无效的 cpp 文件 src/test.cpp 并cmake再次运行,然后运行make. 根据帖子中描述的情况,我必须编译所有内容,因为 cmake 不跟踪此文件。但实际上 cmake 确实检测到更改并且编译失败。难道是我理解错了?我使用的是cmake版本3.17.1
我正在尝试使用CMake构建一个大项目,但我在如何编写CMakeList.txt文件方面很困难.我的项目在不同的文件夹中分开,每个文件夹包含一组或多或少相关的.hpp和.cpp文件,如下所示:
root
- memory
-- Memory.cpp
-- Memory.hpp
-- MemoryManager.hpp
-- MemoryManager.cpp
-- CMakeLists.txt
- tools
-- Array.cpp
-- Array.hpp
-- CMakeLists.txt
- main.cpp
- CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)
我想将所有文件一起构建为可执行文件.我不想在每个子文件夹中构建库,因为我认为没有任何理由这样做.我还想避免在位于项目根目录的CMakeLists.txt文件的ADD_EXECUTABLE命令中放置所有源文件的单个大列表.
你知道如何正确设置吗?
干杯,
M.
我发现,当我使用和cpp从项目中删除文件时,如果不先完全删除构建目录并从头开始,就无法轻松编译它。CMake 和/或 Ninja 显然会隐藏对其编译的所有文件的大量引用,即使在重新运行 CMake 之前删除 CMake 缓存也不会删除所有引用。cmakeninjacpp
这是一个已知的问题?有解决办法吗?我偶尔会跑步rm $(grep -R <filename> <builddir>),但那是一件可怕的事情。
编辑:看来我错了,因为我无法复制这个问题。手动重新运行 CMake 似乎总是生成正确的文件列表.cpp,甚至用于GLOB生成源列表。