我如何知道哪些选项从 CMake 传递给 GCC?

Posted

技术标签:

【中文标题】我如何知道哪些选项从 CMake 传递给 GCC?【英文标题】:How do I know what options are being passed to GCC from CMake? 【发布时间】:2016-07-04 17:31:13 【问题描述】:

我正在尝试构建一个在其构建系统中使用 CMake 的大型开源项目 (Clang)。我在 Windows 上使用 MinGW64。

构建命令是:

cmake --build . --config Debug --target clang

我在构建时遇到问题,因此我想诊断正在发送到 GCC 的命令。例如,我想知道是否设置了-g

如何查看 CMake 构建触发的 GCC 命令列表?

【问题讨论】:

打开makefile看看就好了。 @IvanRubinson 在我的系统上为 LLVM+clang3.8 生成的 makefile CMake 有超过 9400 行。所以玩得开心。 XD 【参考方案1】:

VERBOSE=1 make | more

示例:

[ 14%] Building CXX object public_api/CMakeFiles/secr_api_tests.dir/tests/exception_test.cpp.o
cd /Users/rhodges/secr/netbeans-secr/public_api && /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++    -I/Users/rhodges/secr/secr/public_api/src -I/Users/rhodges/secr/netbeans-secr/public_api/src -I/Users/rhodges/secr/secr/public_api/tests -I/Users/rhodges/secr/netbeans-secr/public_api/tests -isystem /Users/rhodges/secr/secr/public_api/include -isystem /Users/rhodges/secr/netbeans-secr/public_api/include -isystem /Users/rhodges/secr/netbeans-secr/target_local/include -isystem /Users/rhodges/secr/secr/valuelib/debug/include -isystem /Users/rhodges/secr/netbeans-secr/valuelib/debug/include -isystem /Users/rhodges/secr/secr/valuelib/data/include -isystem /Users/rhodges/secr/netbeans-secr/valuelib/data/include -isystem /Users/rhodges/secr/secr/valuelib/tuple/include -isystem /Users/rhodges/secr/netbeans-secr/valuelib/tuple/include -isystem /Users/rhodges/secr/secr/valuelib/immutable/include -isystem /Users/rhodges/secr/netbeans-secr/valuelib/immutable/include -isystem /Users/rhodges/secr/secr/valuelib/stdext/include -isystem /Users/rhodges/secr/netbeans-secr/valuelib/stdext/include  -std=gnu++14 -o CMakeFiles/secr_api_tests.dir/tests/exception_test.cpp.o -c /Users/rhodges/secr/secr/public_api/tests/exception_test.cpp
...

【讨论】:

不完全是性别歧视。我会说命令主义!反对VERBOSE=1 make | less?不要歧视它。 :-) @skypjack 键入 more 是 30 年的习惯 :) 当 vi 被认为是最先进的时,我使用的是 unix... 现在不了吗?我还在努力戒掉它,而且我从来没有更新过外面的世界!! :-)【参考方案2】:

正如 Richard Hodges 所说,VERBOSE=1 make 是主要的便捷方式。

另一种方法是将-DCMAKE_EXPORT_COMPILE_COMMANDS=ON 添加到您的CMake 调用中,这将生成一个文件compile_commands.json,其中包含每个文件的编译标志的机器可读数据库。

【讨论】:

以上是关于我如何知道哪些选项从 CMake 传递给 GCC?的主要内容,如果未能解决你的问题,请参考以下文章

传递编译器选项 cmake

如何修改传递给 ld 的选项,而不重新编译 gcc

在 CMake 项目中动态更改编译器标志

如何使用 cmake 调试 gcc 代码

cmake 如何知道包含文件和库在哪里?

MinGw Gcc / Gtk+3 / Cmake 编译程序. 如何去掉控制台窗口?