我不是只问自己这个问题.我希望这个问题可以作为许多喜欢我的新手的参考,发现它对于这样一个小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构建到一个目录'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构建)的操作.请告诉我这是可能的,如果是的话,怎么样?或者其他一些源代码构建方法可以很容易地指定不同的参数?
我有一个使用 CMake 构建的 C++ 项目。我希望 CMakeLists.txt 中的构建配置在Release默认情况下以Debug模式构建,并且仅在明确指定时以模式构建。
参考this和this,为了允许从命令行指定构建类型,我设置了如下变量:
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) 我有一个 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) 我有一个使用FindCurses.cmake. 我使用的是 OS X,该操作系统附带旧版本的 ncurses(并且似乎不包含 C++ 绑定),并且我尝试构建的代码需要 ncurses 5.9。我已经使用 homebrew 来安装 5.9,但就像一个好邻居一样,homebrew 不会覆盖操作系统附带的 curses/ncurses 资源(我也不希望它这样做。)
我的直觉是,这是我应该能够在不编辑 CMake 文件的情况下完成的事情,对吧?(因为这种行为变化是特定于我的构建环境的,而不是对项目本身的更改,对吧?)对于 autoconf 项目,我可能会在运行之前添加CFLAGS和环境变量,但 CMake 似乎还有更多的事情要做。LDFLAGS./configure
在 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,但我还是收到了消息并构建了库。在哪里查找错误?