相关疑难解决方法(0)

CMake究竟是如何运作的?

我不是只问自己这个问题.我希望这个问题可以作为许多喜欢我的新手的参考,发现它对于这样一个小CMakeLists.txt文件 后幕后到底发生了什么感到非常困惑.

cmake_minimum_required (VERSION 2.6)
project(Tutorial)
add_executable(Tutorial tutorial.cpp)
Run Code Online (Sandbox Code Playgroud)

这么小 tutorial.cpp

int main() { return 0; } 
Run Code Online (Sandbox Code Playgroud)

生成的文件太多了

CMakeCache.txt  cmake_install.cmake  Makefile
CMakeLists.txt  tutorial.cpp
Run Code Online (Sandbox Code Playgroud)

和一个CMakeFiles包含这么多文件和文件夹的文件夹

CMakeCCompiler.cmake               CMakeOutput.log    Makefile.cmake
cmake.check_cache                  CMakeSystem.cmake  progress.marks
CMakeCXXCompiler.cmake             CMakeTmp           TargetDirectories.txt
CMakeDetermineCompilerABI_C.bin    CompilerIdC        Tutorial.dir
CMakeDetermineCompilerABI_CXX.bin  CompilerIdCXX
CMakeDirectoryInformation.cmake    Makefile2
Run Code Online (Sandbox Code Playgroud)

不了解幕后发生的事情(即:为什么文件必须生成以及它们的目的是什么),是能够学习CMake的最大障碍.

如果有人知道,你可以为了后代而解释它吗?这些文件的目的是什么,当我输入时cmake .,在构建项目之前cmake配置和生成究竟是什么?

cmake

137
推荐指数
2
解决办法
5万
查看次数

让cmake在没有包装脚本的情况下构建源代码?

我正在尝试让cmake构建到一个目录'build',就像project/buildCMakeLists.txt所在的那样project/.

我知道我能做到:

mkdir build
cd build
cmake ../
Run Code Online (Sandbox Code Playgroud)

但这很麻烦.我可以把它放在一个脚本中并调用它,但是为cmake提供不同的参数(比如-G"MSYS Makefiles")是不愉快的,或者我需要在每个平台上编辑这个文件.

我最好在主CMakeLists.txt中执行类似SET(CMAKE_OUTPUT_DIR构建)的操作.请告诉我这是可能的,如果是的话,怎么样?或者其他一些源代码构建方法可以很容易地指定不同的参数?

configuration cmake

25
推荐指数
3
解决办法
2万
查看次数

如何清理CMake生成的项目文件?

我正在使用CMake生成项目文件.

是否有一个命令可以清理所有生成的项目文件?

cmake

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

除非明确覆盖,否则如何创建一个采用默认值的 CMake 变量?

我有一个使用 CMake 构建的 C++ 项目。我希望 CMakeLists.txt 中的构建配置在Release默认情况下以Debug模式构建,并且仅在明确指定时以模式构建。

参考thisthis,为了允许从命令行指定构建类型,我设置了如下变量:

set(CMAKE_BUILD_TYPE Release CACHE STRING "")
Run Code Online (Sandbox Code Playgroud)

但是,这会缓存上次构建的构建类型,因此如果上次构建是Debug,我需要Release在下一次构建中明确指定。

我尝试使用FORCE并尝试添加

unset(CMAKE_BUILD_TYPE CACHE)
Run Code Online (Sandbox Code Playgroud)

之前set(),但是这两种方法都将值固定为Release并覆盖用户指定的值。

有没有办法实现这一目标?谢谢你。


以下是一个 MCVE:

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
set(CMAKE_CXX_STANDARD 11)
project(Test LANGUAGES CXX)

set(CMAKE_BUILD_TYPE Release CACHE STRING "")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DDEBUG")

file(GLOB SOURCES *.cpp)

add_executable(test ${SOURCES})
Run Code Online (Sandbox Code Playgroud)

测试.cpp

#include <iostream>

int main() {
#ifdef DEBUG
    std::cout << "Debug defined" << std::endl;
#else
    std::cout << "Debug not defined" …
Run Code Online (Sandbox Code Playgroud)

c++ default build cmake

7
推荐指数
1
解决办法
7882
查看次数

如何创建最小的 libfuzzer cmake 示例?

我有一个 libFuzzer 使用的简单示例。

// Test_fuzzer.cc
#include <stdint.h>
#include <stddef.h>
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
  if (size > 0 && data[0] == 'H')
    if (size > 1 && data[1] == 'I')
       if (size > 2 && data[2] == '!')
       __builtin_trap();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我可以用 clang 编译它并运行。

clang -g -O1 -fsanitize=fuzzer test_fuzzer.cc //OK
Run Code Online (Sandbox Code Playgroud)

现在我想将 cmake 添加到这个示例中。

// CMakeLists.txt file:
cmake_minimum_required (VERSION 3.11)
project (Tutorial)

set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g -O1 -fsanitize=fuzzer")
add_executable(Tutorial test_fuzzer.cc)
Run Code Online (Sandbox Code Playgroud)
cmake . //OK
make
Run Code Online (Sandbox Code Playgroud)

但我收到错误。如何修复它?

/usr/bin/ld: …
Run Code Online (Sandbox Code Playgroud)

c cmake libfuzzer

6
推荐指数
1
解决办法
3339
查看次数

告诉 CMake 在非默认位置查找 (n)curses 的正确方法?

我有一个使用FindCurses.cmake. 我使用的是 OS X,该操作系统附带旧版本的 ncurses(并且似乎不包含 C++ 绑定),并且我尝试构建的代码需要 ncurses 5.9。我已经使用 homebrew 来安装 5.9,但就像一个好邻居一样,homebrew 不会覆盖操作系统附带的 curses/ncurses 资源(我也不希望它这样做。)

我的直觉是,这是我应该能够在不编辑 CMake 文件的情况下完成的事情,对吧?(因为这种行为变化是特定于我的构建环境的,而不是对项目本身的更改,对吧?)对于 autoconf 项目,我可能会在运行之前添加CFLAGS和环境变量,但 CMake 似乎还有更多的事情要做。LDFLAGS./configure

在 CMake 中执行此操作的惯用方法是什么?

macos cmake

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

什么会导致 CMake 选项不起作用?

我正在准备一个可以使用和不使用 GUI 的应用程序,所以我在我的 CMakeLists.txt 中使用命令

option (NEED_GUI "Include Qt support"  OFF) 
Run Code Online (Sandbox Code Playgroud)

if (NEED_GUI)
  message("****GUI should be OFF****")
  add_subdirectory(QtGUI)   # The Qt-based graphics routines
endif (NEED_GUI)
Run Code Online (Sandbox Code Playgroud)

尽管我将选项设置为 OFF,但我还是收到了消息并构建了库。在哪里查找错误?

qt cmake option

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

标签 统计

cmake ×7

build ×1

c ×1

c++ ×1

configuration ×1

default ×1

libfuzzer ×1

macos ×1

option ×1

qt ×1