看起来CMake在其视图中已经相当根深蒂固,所有C++源文件应该只有一个CMAKE_CXX_COMPILER.我无法找到一种在每个目标的基础上覆盖它的方法.这使得在单个CMakeLists.txt中混合主机和交叉编译非常困难,内置的CMake工具.
所以,我的问题是:对于同一种语言(即C++)使用多个编译器的最佳方法是什么?
使用CMake进行交叉编译时,通常可以通过CMAKE_TOOLCHAIN_FILE选项指定工具链文件.在GNU术语中,可以使用此文件指定主机体系结构工具集.但是,通常不能指望能够执行使用此工具链构建的任何内容.通常,需要为构建体系结构编译一些构建工具.
请考虑以下设置.我有两个源文件genfoo.c和bar.c.在构建期间,genfoo.c需要编译和运行.它的输出需要写入foo.h.然后我可以编译bar.c,哪个#include "foo.h".由于CMake默认使用主机架构工具链,因此说明bar.c很简单.但是,我如何告诉它使用构建架构工具链进行编译genfoo.c?简单地说add_executable(genfoo genfoo.c)会导致使用错误的编译器.
我想在生成的脚本中记录传递给cmake的参数.例如,"my-config.in"将由cmake处理,它的定义如下:
配置= "@ CMAKE_ARGS @"
之后cmake,my-config将包含这样的行:
config =" - DLINUX -DUSE_FOO = y -DCMAKE_INSTALL_PREFIX =/usr"
我试过CMAKE_ARGS,CMAKE_OPTIONS但失败了.没有文件提到这一点.:-(
我知道cmake是构建生成器.这意味着它可以根据CMakeLists.txt的指令生成适当的构建(makefile,Visual Studio项目等).但我不明白我认为有两个相关的事情:
为什么cmake-gui中有两个按钮"Configure"和"Generate"?在我读过的命令行教程(例如这个)中,通常的过程是用一个cmake命令完成的.
什么是cmake世界的缓存?AFAIK是按下"配置"按钮时的状态,但未按下"生成"按钮.但为什么这有用呢?按"配置"后弹出的所有变量是什么意思?为什么我应该编辑它们?是不是唯一允许通过CMakeLists.txt完成的配置?
谢谢
我们有一个代码生成器,可以将通信协议定义生成为多个c ++文件,并希望切换我们的构建系统以使用cmake.我做了一个示例项目来展示我们面临的问题.
代码生成器接收输入文件并可能生成数百个输出文件,因此枚举它们CMakeLists.txt不是一个选项,特别是因为协议在开发期间发生了变化.我们既不想使用通配符.
如果其中一个输入文件发生变化,我们没有找到让cmake重新生成makefile的方法,根据文档我们认为configure_file应该能够做到这一点,但它显然无法完成它的工作.
我们希望main每当生成器(gen在示例中的文件夹中)代码更改或协议定义文件(在我们的示例中in.txt)更新时,cmake都会重新生成主项目的makefile(在示例中的文件夹中).
我有以下文件结构:
src
??? CMakeLists.txt
??? gen
? ??? CMakeLists.txt
? ??? gen.cpp
??? in.txt
??? main
??? CMakeLists.txt
??? main.cpp
Run Code Online (Sandbox Code Playgroud)
具有以下内容:src/CMakeLists.txt:
cmake_minimum_required(VERSION 3.5.1)
project(cmake-config)
add_subdirectory(main)
add_subdirectory(gen)
add_dependencies(main gen run_gen)
Run Code Online (Sandbox Code Playgroud)
GEN /的CMakeLists.txt:
cmake_minimum_required(VERSION 3.5.1)
project(gen)
add_executable(gen gen.cpp)
add_custom_target(
run_gen
COMMAND ./gen ${CMAKE_SOURCE_DIR}/in.txt
COMMENT running gen
)
add_dependencies(run_gen gen)
Run Code Online (Sandbox Code Playgroud)
GEN/gen.cpp:
#include <fstream>
#include <string>
using namespace std;
int main(int argc, char *argv[]){
ifstream inf(argv[1]);
ofstream outf("input.txt");
string …Run Code Online (Sandbox Code Playgroud) 我有以下情况:
我对 CMake 很陌生,我目前面临的问题是:我的应用程序中的源文件找不到 wx 包含文件,我需要设置正确的链接器标志才能将我的应用程序链接到 wxwidgets。
这似乎是由实用程序“wx-config”处理的,该实用程序在使用 --cppflags 或 --libs 标志运行时提供该信息作为输出。但是,我无法弄清楚如何捕获该输出并将其附加到我从 CMakeLists.txt 文件设置的包含目录和链接库中。
所以基本上我想要的是。
到目前为止,我已经尝试过这样的事情:
# Set a target-configuration-specific location
set(wxwidgetsTop ${MYPROJECT_EXTERNAL_DIR}/wxwidgets/wxwidgets_${MYPROJECT_CURRENT_TARGET_CFG})
# Build the project
ExternalProject_Add( wxWidgetsExternal
PREFIX ${wxwidgetsTop}
URL ${MYPROJECT_EXTERNAL_DIR}/tarballs/wxWidgets-3.0.2.tar.bz2
SOURCE_DIR ${wxwidgetsTop}/src/wxwidgets
CONFIGURE_COMMAND ${configure_cmdline}
BUILD_COMMAND make -j${MYPROJECT_NCPU}
INSTALL_COMMAND make install
)
# Create a wxwidgets target to be used as a dependency …Run Code Online (Sandbox Code Playgroud)