首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >打印CMake项目完整的CFLAGS/CXXFLAGS

打印CMake项目完整的CFLAGS/CXXFLAGS
EN

Stack Overflow用户
提问于 2017-09-19 14:40:59
回答 3查看 8.5K关注 0票数 3

是否可以打印(所有目标的) *CFLAGS*CXX_FLAGS完整的CMake项目?

在配置和构建项目之后,我尝试查看CMakeCache.txt,但是所有*C*FLAGS*相关变量几乎都是空的,而且无论如何都不包含我的项目设置,比如特定于我的依赖项的-D-I标志。

我为什么要这么做?为了为clang完整的vim插件创建一个配置文件:id=3302

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-12-19 01:42:58

您还可以让cmake生成要运行的所有命令的json文件:

代码语言:javascript
复制
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON

在以下方面:

代码语言:javascript
复制
mkdir -p release
cd release
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -G Ninja .. && ninja

这将为您提供一个名为compile_commands.json的发布文件,该文件记录了您的命令。这与Stewart的回答类似,只是它会自动将日志放入文件中。另一个优点是这个文件是使用clang的,我发现它非常有用。

票数 8
EN

Stack Overflow用户

发布于 2017-09-21 06:41:32

我建议打印各自目标的属性,而不是打印“全局”变量。当目标被定义时,CMAKE_xxx_FLAGS的值会附加到目标上,之后可能会被修改。

这是我在我的项目中使用的一个有用的助手函数,它受到https://stackoverflow.com/a/34292622/5751151的启发

代码语言:javascript
复制
function(print_target_properties tgt)
    if(NOT TARGET ${tgt})
        message("There is no target named '${tgt}'")
        return()
    endif()

    # this list of properties can be extended as needed
    set(CMAKE_PROPERTY_LIST SOURCE_DIR BINARY_DIR COMPILE_DEFINITIONS
             COMPILE_OPTIONS INCLUDE_DIRECTORIES LINK_LIBRARIES)

    message("Configuration for target ${tgt}")

    foreach (prop ${CMAKE_PROPERTY_LIST})
        get_property(propval TARGET ${tgt} PROPERTY ${prop} SET)
        if (propval)
            get_target_property(propval ${tgt} ${prop})
            message (STATUS "${prop} = ${propval}")
        endif()
    endforeach(prop)

endfunction(print_target_properties)
票数 9
EN

Stack Overflow用户

发布于 2017-09-19 19:49:56

你能用消息吗?这是来自来自cmake的有用脚本的一个示例。

代码语言:javascript
复制
# the compiler flags for compiling C sources 
MESSAGE( STATUS "CMAKE_C_FLAGS: " ${CMAKE_C_FLAGS} )

# the compiler flags for compiling C++ sources 
MESSAGE( STATUS "CMAKE_CXX_FLAGS: " ${CMAKE_CXX_FLAGS} )

否则,我将经常使用详细模式进行编译。由于我使用忍者作为我的发电机,它看起来如下:

代码语言:javascript
复制
cmake .. -GNinja
ninja -v

控制台的输出包含完整的编译命令,在我的示例中如下所示:

代码语言:javascript
复制
[1/2] C:\msys64\mingw32\bin\c++.exe -D<Defines> -I<Includes> -isystem C:/msys64/mingw32/include -g -MD -MT <object>.obj -MF <object>.obj.d -o <object>.obj -c <object>.cpp
[2/2] C:\msys64\mingw32\bin\c++.exe -g  <object1>.obj <object2>.obj <objectN>.obj -o <Application>.exe -Wl,--major-image-version,0,--minor-image-version,0 <library1>.dll.a <library2>.dll.a -l<systemlib1> -l<systemlib2>

您还可以尝试在命令行中将set( CMAKE_VERBOSE_MAKEFILE on )设置为CMakeLists.txt或cmake .. -DCMAKE_VERBOSE_MAKEFILE=ON,以便在不使用生成器的情况下从cmake中尝试。您可以查看变量这里

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46303348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档