在GCC编译的项目中,
g++与一个嵌套库一起编译gcc?CMake提供了多种机制来获取编译器的标志:
在现代使用中,是否有一种方法比另一种方法更受欢迎?如果是这样的话?此外,该方法如何与MSVC等多种配置系统一起使用?
我正在尝试很长时间来理解生成器表达式的好处, 例如$<xxx:yy>在CMake中,何时以及如何使用它们.任何人都可以通过一些例子清楚地解释清楚.非常感谢
我想补充-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_RELEASE或CMAKE_CXX_FLAGS_DEBUG在CMake的.基本上,我有一些项目默认值与CMake略有不同(例如发布),我不应该问自己"哦,当添加add_compile_options时,他们的-O3或我们的-O2优先."
现在,我知道如何设置这些值,但我不知道如何使用户可以通过两种常用方式进行编辑:DCMAKE_CXX_FLAGS_DEBUG=yourflags在命令行上使用 - 或者使用ccmake或CMakeSetup配置它.
问题是CMAKE为这些设置和缓存它们自己的默认值,如果你试图在不使用FORCE的情况下覆盖变量,那么"默认值"永远不会改变.如果我在set命令中使用FORCE:set(CMAKE_CXX_FLAGS_DEBUG blah CACHE STRING "" FORCE)它会在每次运行脚本时覆盖它,从而消除了用户根据需要进行更改的可能性.
我设法通过执行以下操作来破解它与CCMAKE一起工作,但是这仍然不起作用,cmake -DCMAKE_CXX_FLAGS_DEBUG因为它覆盖用户更改后完成它:
set(DEFAULTS_SET FALSE CACHE BOOL "")
set(CMAKE_CXX_FLAGS_DEBUG "-this -that" CACHE STRING "" FORCE)
set(DEFAULTS_SET TRUE CACHE BOOL "" FORCE)
Run Code Online (Sandbox Code Playgroud)
显然,这是一个讨厌的黑客,并没有完全工作(在cmake -Dwhatever = thisorthat的情况下).我也可以添加其他构建类型,但我真的不明白为什么只需更改一些简单的东西就是必要的.
编辑2015年3月1日:
我已经创建了一个有效的解决方案,尽管我仍然对我必须做的事情感到非常激动.我看到其他评论解决了设置CMAKE_CXX_FLAGS_DEBUG和朋友的问题而没有让他们受到破坏,但这最初对我不起作用,因为我试图根据正在使用的编译器选择它们.但是,在它已经为我填充变量之前,编译器尚未确定.我使用的技巧如下.您必须在项目命令之前将flags变量设置为'special'.
set(CMAKE_CXX_FLAGS_DEBUG "_UNSET" CACHE STRING "")
project(your_project C CXX)
if(${CMAKE_CXX_FLAGS_DEBUG} STREQUAL "_UNSET")
# Do some compiler switching here and then set your flags with FORCE.
set(CMAKE_CXX_FLAGS_DEBUG "-ggdb3 -O0" CACHE STRING "" FORCE)
endif() …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)