相关疑难解决方法(0)

将CMake与多个编译器一起用于同一种语言

看起来CMake在其视图中已经相当根深蒂固,所有C++源文件应该只有一个CMAKE_CXX_COMPILER.我无法找到一种在每个目标的基础上覆盖它的方法.这使得在单个CMakeLists.txt中混合主机和交叉编译非常困难,内置的CMake工具.

所以,我的问题是:对于同一种语言(即C++)使用多个编译器的最佳方法是什么?

c++ configuration build cmake

22
推荐指数
3
解决办法
7445
查看次数

如何指示CMake使用构建体系结构编译器

使用CMake进行交叉编译时,通常可以通过CMAKE_TOOLCHAIN_FILE选项指定工具链文件.在GNU术语中,可以使用此文件指定主机体系结构工具集.但是,通常不能指望能够执行使用此工具链构建的任何内容.通常,需要为构建体系结构编译一些构建工具.

请考虑以下设置.我有两个源文件genfoo.cbar.c.在构建期间,genfoo.c需要编译和运行.它的输出需要写入foo.h.然后我可以编译bar.c,哪个#include "foo.h".由于CMake默认使用主机架构工具链,因此说明bar.c很简单.但是,我如何告诉它使用构建架构工具链进行编译genfoo.c?简单地说add_executable(genfoo genfoo.c)会导致使用错误的编译器.

cmake cross-compiling

13
推荐指数
2
解决办法
8064
查看次数

如何捕获CMake命令行参数?

我想在生成的脚本中记录传递给cmake的参数.例如,"my-config.in"将由cmake处理,它的定义如下:

配置= "@ CMAKE_ARGS @"

之后cmake,my-config将包含这样的行:

config =" - DLINUX -DUSE_FOO = y -DCMAKE_INSTALL_PREFIX =/usr"

我试过CMAKE_ARGS,CMAKE_OPTIONS但失败了.没有文件提到这一点.:-(

cmake

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

当CLI在一个命令中执行所有操作时,为什么GUI配置和生成中有两个按钮

我知道cmake是构建生成器.这意味着它可以根据CMakeLists.txt的指令生成适当的构建(makefile,Visual Studio项目等).但我不明白我认为有两个相关的事情:

  1. 为什么cmake-gui中有两个按钮"Configure"和"Generate"?在我读过的命令行教程(例如这个)中,通常的过程是用一个cmake命令完成的.

  2. 什么是cmake世界的缓存?AFAIK是按下"配置"按钮时的状态,但未按下"生成"按钮.但为什么这有用呢?按"配置"后弹出的所有变量是什么意思?为什么我应该编辑它们?是不是唯一允许通过CMakeLists.txt完成的配置?

谢谢

cmake cmake-gui

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

动态生成的cmake源文件列表

我们有一个代码生成器,可以将通信协议定义生成为多个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)

c++ cmake

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

如何使用 CMake 按需构建 wxwidgets 并与之链接

我有以下情况:

  • 我正在开发一个依赖于许多第三方库的应用程序,其中包括 wxwidgets
  • 我使用 Linux 作为我的构建主机系统为多个目标配置(x86、arm、Linux、Windows)构建应用程序
  • 由于上述多个目标配置,我选择使用 CMake 的 ExternalProject_Add 函数从源代码构建这些第三方库。
  • 第三方库是在与我的应用程序的 CMAKE_BINARY_DIR 分开的位置“按需”构建的,这样我就可以为我的应用程序擦除构建树,而无需重建第三方库(需要很长时间)。
  • 第三方库的位置根据我构建它们的目标配置而有所不同(显然)。

我对 CMake 很陌生,我目前面临的问题是:我的应用程序中的源文件找不到 wx 包含文件,我需要设置正确的链接器标志才能将我的应用程序链接到 wxwidgets。

这似乎是由实用程序“wx-config”处理的,该实用程序在使用 --cppflags 或 --libs 标志运行时提供该信息作为输出。但是,我无法弄清楚如何捕获该输出并将其附加到我从 CMakeLists.txt 文件设置的包含目录和链接库中。

所以基本上我想要的是。

  1. 为当前目标配置构建 wxwidgets(如果它不存在)
  2. 运行 wx-config --cppflags 和 --libs 以找出当前目标配置的正确包含目录和链接器标志
  3. 在构建属于我自己的应用程序的目标时使用步骤 2 中的信息

到目前为止,我已经尝试过这样的事情:

# 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)

c++ wxwidgets build cmake

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