CMake:自定义工具链:CMAKE_AR 和 CMAKE_CXX_ARCHIVE_CREATE

Posted

技术标签:

【中文标题】CMake:自定义工具链:CMAKE_AR 和 CMAKE_CXX_ARCHIVE_CREATE【英文标题】:CMake: custom toolchain: CMAKE_AR and CMAKE_CXX_ARCHIVE_CREATE 【发布时间】:2018-09-20 15:23:49 【问题描述】:

我有一个自定义工具链。我将 CMAKE_AR 变量设置为正确的 ar 程序的路径。但是,当我构建一个静态库时,我遇到了错误:

cmd.exe /C "cd . && "C:\Program Files (x86)\CMake\bin\cmake.exe" -E remove Library\libLibrary.a && "" qc Library\libLibrary.a  Library/CMakeFiles/Library.dir/src/Library.cpp.obj && cd ."
'""' is not recognized as an internal or external command,

如果我没记错的话,CMake 正在使用 CMAKE_CXX_ARCHIVE_CREATE 变量来创建库。它的默认值为:

set(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> qc <TARGET> <LINK_FLAGS> <OBJECTS>")

(https://github.com/Kitware/CMake/blob/v3.10.3/Modules/CMakeCXXInformation.cmake) 问题是该部分没有被 CMAKE_AR 变量替换。这很奇怪,因为而且似乎是正确的。 我知道我可以通过将 CMAKE_CXX_ARCHIVE_CREATE 替换为 ar 程序的路径来更改它,但我还必须更改其他变量。

CMake:3.10.2 操作系统:Windows 10

这似乎是 CMake 中的一个错误。

【问题讨论】:

您没有显示如何在您的工具链中设置 CMAKE_AR 变量。另请参阅my answer。 在使用 cmake 3.13.2 在命令行上传递 -DCMAKE_AR=$AR 时相同 - 你介意在 gitlab.kitware.com/cmake/cmake/issues 中打开一个错误吗?我没有使用工具链,而是自定义 CMAKE_OSX_SYSROOT 我在使用 cmake 3.10.2 时遇到了完全相同的问题。我在工具链文件中设置了 CMAKE_AR。我还将我的 c 和 c++ 编译器设置在同一个工具链文件中。可以找到具有正确路径的编译器。 ar 命令在生成的 Makefile 中保留为“”(空白),导致 try_compile() 失败。 SET(CMAKE_AR "x86_64-w64-mingw32-ar") SET(CMAKE_C_COMPILER "x86_64-w64-mingw32-gcc") 【参考方案1】:

这是我的错。 我在调用 cmake 时设置了 CMAKE_TOOLCHAIN:

cmake -G "Ninja" -DCMAKE_TOOLCHAIN_FILE=../app/toolchain.cmake ../app

但是我没有在 CMakeLists.txt 中包含这个 toolchain.cmake。我认为设置 CMAKE_TOOLCHAIN 就足够了。一些变量的变化是可见的,但不是全部可见,这很奇怪。

【讨论】:

【参考方案2】:

我发现另一个人对 CMAKE_AR here 有问题的参考。他们提到它只有在值被缓存时才有效。我尝试在我的工具链文件中添加缓存设置并且它有效。请注意,只有 CMAKE_AR 的值需要被缓存,而不是编译器的值。似乎是 CMake 中的一个错误。

SET(CMAKE_C_COMPILER       "x86_64-w64-mingw32-gcc") 
SET(CMAKE_CXX_COMPILER     "x86_64-w64-mingw32-g++") 
SET(CMAKE_FORTRAN_COMPILER "x86_64-w64-mingw32-gfortran") 
SET(CMAKE_AR               "x86_64-w64-mingw32-ar" CACHE FILEPATH "" FORCE) 

【讨论】:

以上是关于CMake:自定义工具链:CMAKE_AR 和 CMAKE_CXX_ARCHIVE_CREATE的主要内容,如果未能解决你的问题,请参考以下文章

CMake:使用自定义工具输出生成标头

cmake/ASR1603:交叉编译工具链定义

尝试在 Ubuntu 上配置 CMake 工具链

cmake:基于MDK(Keil)的Nationstech.N32G45x平台交叉编译工具链定义

在使用自定义工具链时包括用于 CLion 检查的目录

当我在 CLion 2020.3 上使用远程工具链时,cmake 无法解析本地路径