【问题标题】:Methods to Cross Compile only defined ("some") Targets in a CMake Project交叉编译的方法仅在 CMake 项目中定义(“某些”)目标
【发布时间】:2018-01-12 11:01:13
【问题描述】:

到目前为止,我已经使用了有据可查的方法来交叉编译代码与 cmake,定义了一个工具链文件,就像在帖子的末尾一样。 然而,我想找到一种交叉编译的方法,而不是我的整个 C、C++ 项目,而只是某些目标。 例如,当您使用 google test 对嵌入式系统进行单元测试并与 CMAKE 协调一切时,这些用例就是一个例子。 任何人都可以提供参考、链接或最小示例来解决这个问题吗?

我不想为不同的架构定义两次目标,我更愿意定义工具链文件并以某种方式将其传递给相应的 CMakeLists.txt 或目标。

这是一个最小工具链文件的示例,因为我会将它用于 cmake 项目的全局配置。

SET(CMAKE_SYSTEM_NAME Generic)

SET(CMAKE_C_COMPILER   ..)
SET(CMAKE_CXX_COMPILER ..)
SET(CMAKE_C_COMPILER   C:\,,,.exe)
SET(CMAKE_CXX_COMPILER C:\,,,.exe)

SET(CMAKE_FIND_ROOT_PATH  .\build\ghs )

# adjust the default behaviour of the FIND_XXX() commands:
# search headers and libraries in the target environment, search 
# programs in the host environment
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

【问题讨论】:

  • 你知道CMake的构建模式吗?在使用您的工具链文件进行配置后,从您的构建目录调用cmake --build . --target <YOUR_TARGET_NAME> --config Debug 将构建指定的目标和配置。不幸的是,您一次只能构建一个目标。
  • 当你想运行单元测试时,你不应该用非嵌入式编译器重建所有目标吗? (不仅是 cpp 文件)。您将无法将嵌入式 C 与非嵌入式 cpp 链接。
  • @vre 你的意思是把关于交叉编译需求的细节放在像调试这样的自定义配置中吗?
  • @sruli 是的,你可以这样做。工具链文件提供了一些细节,其他细节由特殊目标描述。在不了解您的构建过程的情况下,我只是想确保您了解 CMake 的构建模式并且它可能适合您的需求。

标签: cmake embedded cross-compiling googletest googlemock


【解决方案1】:

我有一个项目,我希望能够在 unit_test 和 crossCompile 之间进行选择。这是我的 cmakelist 来源:

if(APP_TYPE STREQUAL "PROJ_UNIT_TEST")
    #compiler choice
    set( ENV{CC} ${CM_ECLIPSE_HOME}/../../MinGW/bin/gcc.exe)


else()
    #CC has to be set before project() that will search for the compiler 
    #this is deprecated : CMAKE_FORCE_C_COMPILER(arm-none-eabi-gcc GNU)
    set( ENV{CC} ${CM_ECLIPSE_HOME}/../../GNU\ Tools\ ARM\ Embedded/6-2016-q4-major/bin/arm-none-eabi-gcc.exe)

我们通过APP_TYPE 参数在两个选项之间进行选择。我不使用工具链文件,而是让 cmake 在我的环境变量中自动搜索编译器。

这可能不是最好的解决方案,但适用于我的项目

【讨论】:

  • 非常感谢提供的示例。这确实有效,但我最终使用自定义构建类型实现了它,因为这给了我更大的灵活性。我很快就会提供一个最小的例子!
  • 您的示例可能很快对我有用。可以分享一下吗?
猜你喜欢
  • 2013-07-30
  • 2015-08-04
  • 2021-09-14
  • 2012-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-17
相关资源
最近更新 更多