我想使用IAR编译器。我注意到CMake已经有一堆关于这个编译器的文件:
https://github.com/jevinskie/cmake/blob/master/Modules/Compiler/IAR.cmake
从我读到的常见解决方案是手动指定我的CMakeLists.txt
中的所有工具链:
set(CMAKE_C_COMPILER iccarm)
set(CMAKE_CPP_COMPILER iccarm)
CMake如何将这些定义与`Modules / Compiler / IAR.cmake“联系起来?
我以为我只需要这样做
include("Modules/Compiler/IAR.cmake")
指定IAR编译器的正确方法是什么?
当我做
cmake .
它仍然试图使用gcc
而不是我的IAR编译器。为什么?
要选择特定的编译器,您可以使用CMake wiki中的几个解决方案:
方法1:使用环境变量
对于C和C ++,设置CC
和CXX
环境变量。不保证此方法适用于所有生成器。 (具体来说,如果你试图设置Xcode的GCC_VERSION
,这种方法会混淆Xcode。)例如:
CC=gcc-4.2 CXX=/usr/bin/g++-4.2 cmake -G "Your Generator" path/to/your/source
方法2:使用cmake -D
使用CMAKE_FOO_COMPILER
在命令行上将相应的cmake -D
变量设置为有效的编译器名称或完整路径。例如:
cmake -G "Your Generator" -D CMAKE_C_COMPILER=gcc-4.2 -D CMAKE_CXX_COMPILER=g++-4.2 path/to/your/source
方法3(避免):使用set()
使用CMAKE_FOO_COMPILER
将相应的set()
变量设置为列表文件中的有效编译器名称或完整路径。这必须在设置任何语言之前完成(即:在任何project()
或enable_language()
命令之前)。例如:
set(CMAKE_C_COMPILER "gcc-4.2")
set(CMAKE_CXX_COMPILER "/usr/bin/g++-4.2")
project("YourProjectName")
维基没有提供为什么要避免第三种方法的原因......
你可以这样调用cmake
:
cmake -DCMAKE_C_COMPILER=iccarm ...
要么
cmake -DCMAKE_CXX_COMPILER=...
如果您不想使用PC的标准编译器,则必须为CMake提供编译器的路径。您可以通过环境变量,工具链文件或CMake命令行中的直接定义来执行此操作(请参阅例如CMake Error at CMakeLists.txt:30 (project): No CMAKE_C_COMPILER could be found)。
将编译器的名称/路径放入CMakeLists.txt将阻止您的项目跨平台。
CMake通过编译special C/C++ files来检查编译器ID。因此无需手动包含来自Module/Compiler
或Module/Platform
。
这将由CMake根据其编译器和平台检查自动完成。
参考
您需要创建工具链文件,并使用CmakeForceCompiler模块。
以下是使用IAR进行裸机ARM开发的示例工具链文件:
include(CMakeForceCompiler)
set(CMAKE_SYSTEM_NAME Generic) # Or name of your OS if you have one
set(CMAKE_SYSTEM_PROCESSOR arm) # Or whatever
set(CMAKE_CROSSCOMPILING 1)
set(CMAKE_C_COMPILER iccarm) # Change the arm suffix if appropriate
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) # Required to make the previous line work for a target that requires a custom linker file
最后一行是必要的,因为CMake将尝试使用编译器编译测试程序以确保它工作并从预处理器定义中获取一些版本信息。如果没有这一行,CMake将使用add_executable()作为测试程序,你将得到错误“The C compiler”XXX“无法编译一个简单的测试程序。”这是因为测试程序无法链接,因为它没有您的自定义链接器文件(我假设是裸机开发,因为这是IAR通常用于的)。该行告诉CMake使用add_library()代替,这使得测试在没有链接器文件的情况下成功。此解决方法的来源:this CMake mailing list post。
然后,假设您的工具链文件名为iar-toolchain.cmake,请调用CMake,如下所示:
cmake -DCMAKE_TOOLCHAIN_FILE=iar-toolchain.cmake .