相关疑难解决方法(0)

在CMake中使用GLOB或每个文件单独指定源文件是否更好?

CMake提供了几种指定目标源文件的方法.一种是使用globbing(文档),例如:

FILE(GLOB MY_SRCS dir/*)
Run Code Online (Sandbox Code Playgroud)

另一个是单独指定每个文件.

哪种方式更喜欢?Globbing似乎很容易,但我听说它有一些缺点.

cmake

145
推荐指数
4
解决办法
7万
查看次数

最简单但完整的CMake示例

不知何故,我对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"访问我的资源

c++ cmake project-setup

110
推荐指数
3
解决办法
9万
查看次数

cmake:如何创建visual studio过滤器

我已经环顾四周(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)

欢迎任何帮助!

cmake filter visual-studio

18
推荐指数
1
解决办法
1万
查看次数

如何使用cmake为嵌套子目录设置Visual Studio过滤器

我有以下结构

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++ cmake visual-studio visual-studio-2012

17
推荐指数
3
解决办法
8962
查看次数

如何为具有多个子目录的大项目编写"CMakeLists.txt"?

我正在开发一个模拟项目:从目标平台获取嵌入式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)

c linux makefile cmake codelite

11
推荐指数
1
解决办法
2853
查看次数

将文件夹下的所有文件添加到CMake glob?

我刚看过这个:

CMake - 自动将文件夹中的所有文件添加到目标?

答案表明文件为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)

(是的,有那个间距.)

我在这做错了什么?

glob cmake build-dependencies

9
推荐指数
1
解决办法
2万
查看次数

Android-Studio 不会自动在项目中包含新的 C++ 文件

总是当我添加一个新的 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?

提前致谢!

android cmake android-ndk android-build android-studio

7
推荐指数
0
解决办法
5339
查看次数

CMake 文件 glob 是邪恶的?

根据为什么 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

c++ cmake

5
推荐指数
1
解决办法
496
查看次数

Cmake - 如何构建在不同子文件夹中分隔的项目

我正在尝试使用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.

cmake subdirectory

3
推荐指数
1
解决办法
1380
查看次数

CMake/Ninja 尝试编译已删除的“.cpp”文件

我发现,当我使用和cpp从项目中删除文件时,如果不先完全删除构建目录并从头开始,就无法轻松编译它。CMake 和/或 Ninja 显然会隐藏对其编译的所有文件的大量引用,即使在重新运行 CMake 之前删除 CMake 缓存也不会删除所有引用。cmakeninjacpp

这是一个已知的问题?有解决办法吗?我偶尔会跑步rm $(grep -R <filename> <builddir>),但那是一件可怕的事情。

编辑:看来我错了,因为我无法复制这个问题。手动重新运行 CMake 似乎总是生成正确的文件列表.cpp,甚至用于GLOB生成源列表。

c++ cmake ninja

3
推荐指数
1
解决办法
3228
查看次数