我想编写一个cmake文件,在调试和发布版本中为clang ++,g ++和MSVC设置不同的编译器选项.我目前正在做的事情看起来像这样:
if(MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++latest /W4")
# Default debug flags are OK
set(CMAKE_CXX_FLAGS_RELEASE "{CMAKE_CXX_FLAGS_RELEASE} /O2")
else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1z -Wall -Wextra -Werror")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} some other flags")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3")
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
else()
# nothing special for gcc at the moment
endif()
endif()
Run Code Online (Sandbox Code Playgroud)
但我有几个问题:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} Foo")用append(CMAKE_CXX_FLAGS "Foo")? CMAKE_CXX_FLAGS和类似的变量,但我不知道使用什么其他机制.make foo_debug_clang.所以我的问题是
我在互联网上找到的大多数参考资料要么过时,要么只显示一些简单的例子.我目前正在使用cmake3.8,但如果这有什么不同,我对更新版本的答案更感兴趣.
我的项目的二进制目录结构目前是这样的(Windows):
bin/mainProject/{Debug,Release}
bin/library1/{Debug,Release}
bin/library2/{Debug,Release}
...
bin/libraryN/{Debug,Release}
Run Code Online (Sandbox Code Playgroud)
我想将库library1lib.dll, ...复制libraryNlib.dll到bin/mainProject/{Debug,Release}构建后的目录中。
对于 CMake,我认为使用构建后事件是可行的,因此我尝试将其添加到每个库中CMakeLists.txt:
add_custom_command(TARGET library1 POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE}/library1lib.dll
${CMAKE_BINARY_DIR}/mainProject/${CMAKE_BUILD_TYPE}/
)
Run Code Online (Sandbox Code Playgroud)
目前,有两个问题:
${CMAKE_BUILD_TYPE} 似乎没有定义,至少我在输出窗口中得到了该变量的空字符串。我在我的cmake文件中有这个
get_target_property(moggle_interface_includes moggle INTERFACE_INCLUDE_DIRECTORIES)
message("Moggle interface includes: ${moggle_interface_includes}")
target_link_libraries(motor
moggle
)
get_target_property(motor_includes motor INCLUDE_DIRECTORIES)
message("MOTOR includes ${motor_includes}")
Run Code Online (Sandbox Code Playgroud)
哪个输出这个
Moggle interface includes: "/home/nick/code/onegame/motor/moggle/include"
Motor includes:" "
Run Code Online (Sandbox Code Playgroud)
怎么会这样?当moggle被链接时,它也应该,根据这个
CMake will also propagate "usage requirements" from linked library targets. Usage
requirements affect compilation of sources in the <target>. They are specified by
properties defined on linked targets. During generation of the build system, CMake
integrates usage requirement property values with the corresponding build properties for
<target>:
INTERFACE_COMPILE_DEFINITONS: Appends to COMPILE_DEFINITONS
INTERFACE_INCLUDE_DIRECTORIES: Appends to …Run Code Online (Sandbox Code Playgroud) 在手册页中add_compile_options()我没有看到任何提及如何修改Release/Debug编译器标志.你可以add_compiler_options()用来修改Release/Debug编译器标志吗?如果有,怎么样?
如果不是,推荐的规范方法是修改发布/调试cmake变量[1],如下所述?
[1]即设置cmake变量CMAKE_ <LANG> _FLAGS_ <TYPE>(对于lang c/c ++,它将是:CMAKE_CXX_FLAGS_RELEASE,CMAKE_CXX_FLAGS_DEBUG,CMAKE_C_FLAGS_RELEASE,CMAKE_C_FLAGS_DEBUG).