CMake提供了多种机制来获取编译器的标志:
在现代使用中,是否有一种方法比另一种方法更受欢迎?如果是这样的话?此外,该方法如何与MSVC等多种配置系统一起使用?
使用clang ++时,如何-std=c++0x在编译时使CMake使用该标志,但在链接时不能?
关于使用clang作为编译器还有其他一些帖子,但我没有找到关于设置c ++标准的任何提示.
这是我尝试过的:
的CMakeLists.txt:
project(test)
add_executable(main main.cxx)
Run Code Online (Sandbox Code Playgroud)
ClangOverride.txt:
SET (CMAKE_C_FLAGS_INIT "-Wall -std=c99")
SET (CMAKE_C_FLAGS_DEBUG_INIT "-g")
SET (CMAKE_C_FLAGS_MINSIZEREL_INIT "-Os -DNDEBUG")
SET (CMAKE_C_FLAGS_RELEASE_INIT "-O3 -DNDEBUG")
SET (CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "-O2 -g")
SET (CMAKE_CXX_FLAGS_INIT "-Wall -std=c++0x -stdlib=libc++")
SET (CMAKE_CXX_FLAGS_DEBUG_INIT "-g")
SET (CMAKE_CXX_FLAGS_MINSIZEREL_INIT "-Os -DNDEBUG")
SET (CMAKE_CXX_FLAGS_RELEASE_INIT "-O3 -DNDEBUG")
SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "-O2 -g")
SET (CMAKE_EXE_LINKER_FLAGS_INIT "")
Run Code Online (Sandbox Code Playgroud)
main.cxx:
int main(){ return 0; }
Run Code Online (Sandbox Code Playgroud)
用于调用的命令 cmake
CC=clang CXX=clang++ cmake .. -DCMAKE_USER_MAKE_RULES_OVERRIDE=ClangOverride.txt -DCMAKE_BUILD_TYPE=Release
Run Code Online (Sandbox Code Playgroud)
建设项目:
VERBOSE=1 make
Run Code Online (Sandbox Code Playgroud)
这将调用以下两个命令:
/usr/bin/clang++ -Wall -std=c++0x -stdlib=libc++ -O3 -DNDEBUG -o CMakeFiles/main.dir/main.cxx.o …Run Code Online (Sandbox Code Playgroud) 我想补充-std=c++11一下
add_compile_options("-std=c++11")
Run Code Online (Sandbox Code Playgroud)
但是,这也将它们添加到C文件的编译中,而不仅仅是C++.我知道我可以根据使用的配置添加条件编译标志:
add_compile_options("$<$<CONFIG:DEBUG>:-addMeInDebugOnly>")
Run Code Online (Sandbox Code Playgroud)
如何将我的标志仅添加到c ++文件?我正在寻找类似的东西:
add_compile_options("$<$<??:??>:-std=c++11>")
Run Code Online (Sandbox Code Playgroud)
但是我需要填写问号呢?
我在工具链文件中看到了以下设置 CMAKE_CXX_FLAGS 的方法:
SET(CMAKE_CXX_FLAGS "-m32" CACHE STRING "C++ compiler flags" FORCE)
Run Code Online (Sandbox Code Playgroud)
我应该在工具链文件中使用它而不是
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")
Run Code Online (Sandbox Code Playgroud)
?
它们之间有什么区别?
我正在尝试交叉编译嵌入式ARM Cortex构建的项目,但我无法使链接器正常工作.我想使用armlink,但没有文件传递给armlink,因此没有生成.elf文件.
我的CMakeLists.txt非常简单,如下所示.之后显示失败,表明makefile在没有任何参数的情况下调用了armlink.
任何指针都会有所帮助 - 我搜索并阅读了很多帖子,但他们似乎都有更多的参与要求.
cmake_minimum_required(VERSION 2.8)
project(test_arm)
enable_language(C ASM)
# Cross-compilation for ARM
SET(CMAKE_C_COMPILER armcc)
SET(CMAKE_LINKER armlink)
SET(CMAKE_C_LINK_EXECUTABLE armlink)
SET(CMAKE_C_FLAGS "--cpu=Cortex-M3")
SET(LINK_FLAGS "--map --ro-base=0x0 --rw-base=0x0008000 --first='boot.o(RESET)' --datacompressor=off")
SET(CMAKE_EXE_LINKER_FLAGS "--map --ro-base=0x0 --rw-base=0x0008000 --first='boot.o(RESET)' --datacompressor=off")
include_directories(../include)
add_executable(blinky blinky.c)
set_target_properties(blinky PROPERTIES LINKER_LANGUAGE C)
Run Code Online (Sandbox Code Playgroud)
失败如下,但我想对于我的CMakeLists中有一些愚蠢问题的人来说很明显:
$ make VERBOSE=1
[100%] Building C object CMakeFiles/blinky.dir/blinky.c.o
/usr/bin/cmake -E cmake_link_script CMakeFiles/blinky.dir/link.txt --verbose=1
armlink
Linking C executable blinky
Product: DS-5 Professional 5.21.0 [5210017]
Component: ARM Compiler 5.05 update 1 (build 106)
Tool: armlink [4d0efa]
For support see …Run Code Online (Sandbox Code Playgroud) 我想将链接器标志传递给项目中的所有子项目(子目录CMakeList)。
在切换到新的cmake 3.3之前,我使用了运行良好的以下代码(cmake 3.2),为编译和链接添加了标志:
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -stdlibc++")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -stdlibc++")
Run Code Online (Sandbox Code Playgroud)
在cmake 3.3中,它不再起作用,并且仅在编译步骤设置标志。我更新了CMakeList以使用更“现代”的cmake语法:
set(MY_DEBUG_OPTIONS -g -stdlib=libstdc++ -Wfatal-errors)
set(MY_RELEASE_OPTIONS -O3 -stdlib=libstdc++ -Wfatal-errors)
add_compile_options(
"$<$<CONFIG:DEBUG>:${MY_DEBUG_OPTIONS}>"
"$<$<CONFIG:RELEASE>:${MY_RELEASE_OPTIONS}>")
Run Code Online (Sandbox Code Playgroud)
这为所有子项目设置了编译标志,是否对链接程序标志采取了类似的方法?我知道可以使用target_link_libraries命令在目标基础上添加链接器标志,但找不到其他任何东西。
我尝试使用CMAKE_SHARED_LINKER_FLAGS变量(以及exe,模块等对应的var)没有成功。
更新:
事实证明,这与cmake版本无关CMAKE_CXX_FLAGS_XXX,除了第一个make命令外,变量都可以正常工作。如果make第二次运行(在CmakeList中进行了修改),则会显示标志。
我想我在使用简单的CMakeList进行测试时找到了一个解决方案:如果在project命令后声明了标志,它就可以按预期工作。我不知道这是cmake本身的要求,还是只是怪异的行为。
cmake_minimum_required (VERSION 3.2)
set(PROJECT Test_Project)
# Not working (on first run)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -stdlib=libstdc++ -Wfatal-errors")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g -stdlib=libstdc++ -Wfatal-errors")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -stdlib=libstdc++ -Wfatal-errors")
project(${PROJECT})
# Declare here instead...
add_executable(Test test.cpp)
MESSAGE( STATUS "Config flags : " ${CMAKE_CXX_FLAGS_RELEASE})
Run Code Online (Sandbox Code Playgroud)
使用:
cmake …Run Code Online (Sandbox Code Playgroud) 我需要编写一个工具链文件来在我的构建系统上配置特殊的编译器前缀和CFLAGS.我正试图用CMake做,但我很难过.
这是我的toolchain.cmake文件的示例:
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_CROSSCOMPILING TRUE)
set(COMPILER_PREFIX sh4)
set(USER_ROOT_PATH /opt/st40)
set(CMAKE_FIND_ROOT_PATH ${USER_ROOT_PATH})
find_program(CMAKE_C_COMPILER NAMES ${COMPILER_PREFIX}gcc)
find_program(CMAKE_CXX_COMPILER NAMES ${COMPILER_PREFIX}g++)
find_program(CMAKE_AR NAMES ${COMPILER_PREFIX}ar)
find_program(CMAKE_RANLIB NAMES ${COMPILER_PREFIX}ranlib)
set(CMAKE_C_FLAGS "-mruntime=os21 -mboard=board_custom003024_map256_se -specs=lib/custom003024_h205_board.mem")
Run Code Online (Sandbox Code Playgroud)
但是在编译器检查期间我收到此错误:
Building C object
CMakeFiles/cmTryCompileExec2889774418.dir/testCCompiler.c.obj
/opt/st40/bin/sh4gcc -o
CMakeFiles/cmTryCompileExec2889774418.dir/testCCompiler.c.obj -c
/project/cmake/build/CMakeFiles/CMakeTmp/testCCompiler.c
Linking C executable cmTryCompileExec2889774418
/usr/bin/cmake -E cmake_link_script
CMakeFiles/cmTryCompileExec2889774418.dir/link.txt --verbose=1
/opt/st40/bin/sh4gcc
CMakeFiles/cmTryCompileExec2889774418.dir/testCCompiler.c.obj -o
cmTryCompileExec2889774418
sh4gcc: -mboard undefined
gmake[1]: Leaving directory
`/project/cmake/build/CMakeFiles/CMakeTmp'
Run Code Online (Sandbox Code Playgroud)
在CMakeCache.txt上,我可以看到以下变量:
//Flags used by the compiler during all build types.
CMAKE_C_FLAGS:STRING=
Run Code Online (Sandbox Code Playgroud)
如您所见,它不会在sh4gcc调用中使用CMAKE_C_FLAGS变量.我在这里错过了什么?