gpt4 book ai didi

c++ - 从 Cmake 创建 Xcode 项目包含不需要的编译器标志

转载 作者:太空宇宙 更新时间:2023-11-04 13:15:33 27 4
gpt4 key购买 nike

我一直无法找到明确的答案,如果有答案,我深表歉意。

我使用 cmake 生成项目文件,因为我倾向于跨平台工作。在 OSX/Xcode 上,我看到使用了不需要的编译器标志,特别是警告启用/禁用。我喜欢在编译时打开尽可能多的警告,并将警告设置为错误。

考虑以下几点:

文件:CMakeLists.txt

cmake_minimum_required( VERSION 3.0 )
project( test )
set( CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -std=c++14 )
add_compile_options( "-Werror" )
add_compile_options( "-Weverything" )
add_compile_options( "-Wno-c++98-compat-pedantic" )
add_compile_options( "-Wno-padded" )
add_executable( Test main.cpp )
target_link_libraries( Test libstdc++.dylib libc++.dylib )

文件:main.cpp

#include <iostream>

int main( int argc, char * const argv[] )
{
(void)argc;
(void)argv;
std::cout << "Kittens." << std::endl;
return 0;
}

如果我然后运行 ​​cmake:

cmake -G Xcode .

(通常我会使用 builds 目录,但为了简单起见不在这里)。

然后构建(从命令行):

cmake --build . --config Debug --target ALL_BUILD

简单示例将编译。如果我现在查看用于编译 main.cpp 的命令,我会看到以下内容:

CompileC test.build/Debug/Test.build/Objects-normal/x86_64/main.o main.cpp normal x86_64 c++ com.apple.compilers.llvm.clang.1_0.compiler
cd /Users/username/Development/test
export LANG=en_US.US-ASCII
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x c++ -arch x86_64 -fmessage-length=101 -fdiagnostics-show-note-include-stack -fmacro-backtrace-limit=0 -fcolor-diagnostics -Wno-trigraphs -fpascal-strings -O0 -Wno-missing-field-initializers -Wno-missing-prototypes -Wno-return-type -Wno-non-virtual-dtor -Wno-overloaded-virtual -Wno-exit-time-destructors -Wno-missing-braces -Wparentheses -Wswitch -Wno-unused-function -Wno-unused-label -Wno-unused-parameter -Wno-unused-variable -Wunused-value -Wno-empty-body -Wno-uninitialized -Wno-unknown-pragmas -Wno-shadow -Wno-four-char-constants -Wno-conversion -Wno-constant-conversion -Wno-int-conversion -Wno-bool-conversion -Wno-enum-conversion -Wno-shorten-64-to-32 -Wno-newline-eof -Wno-c++11-extensions -DCMAKE_INTDIR=\"Debug\" -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk -fasm-blocks -fstrict-aliasing -Wdeprecated-declarations -Winvalid-offsetof -mmacosx-version-min=10.11 -g -Wno-sign-conversion -I/Users/username/Development/test/Debug/include -I/Users/username/Development/test/test.build/Debug/Test.build/DerivedSources/x86_64 -I/Users/username/Development/test/test.build/Debug/Test.build/DerivedSources -Wmost -Wno-four-char-constants -Wno-unknown-pragmas -F/Users/username/Development/test/Debug -std=c++14 -Werror -Weverything -Wno-c++98-compat-pedantic -Wno-padded -MMD -MT dependencies -MF /Users/username/Development/test/test.build/Debug/Test.build/Objects-normal/x86_64/main.d --serialize-diagnostics /Users/username/Development/test/test.build/Debug/Test.build/Objects-normal/x86_64/main.dia -c /Users/username/Development/test/main.cpp -o /Users/username/Development/test/test.build/Debug/Test.build/Objects-normal/x86_64/main.o

这里真正烦人的是任何 -W 选项。在我的 CMakeLists.txt 中,我已经明确表示我想要所有警告,将警告视为错误,并将几个警告列入白名单。

但是,如果我去掉编译命令中的所有 -W 选项,我会看到(除了我要求的):

-Wno-trigraphs
-Wno-missing-field-initializers
-Wno-missing-prototypes
-Wno-return-type
-Wno-non-virtual-dtor
-Wno-overloaded-virtual
-Wno-exit-time-destructors
-Wno-missing-braces
-Wparentheses
-Wswitch
-Wno-unused-function
-Wno-unused-label
-Wno-unused-parameter
-Wno-unused-variable
-Wunused-value
-Wno-empty-body
-Wno-uninitialized
-Wno-unknown-pragmas
-Wno-shadow
-Wno-four-char-constants
-Wno-conversion
-Wno-constant-conversion
-Wno-int-conversion
-Wno-bool-conversion
-Wno-enum-conversion
-Wno-shorten-64-to-32
-Wno-newline-eof
-Wno-c++11-extensions
-Winvalid-offsetof
-Wno-sign-conversion
-Wmost
-Wno-four-char-constants
-Wno-unknown-pragmas

列出的一些东西我真的不想禁用。我真的只想将我在 cmake 文件中指定的 -W 选项用于编译,但我看不到是谁从哪里注入(inject)所有这些额外的东西。

有什么方法可以让 cmake 告诉 xcode 不要在编译中包含所有这些额外的 -W 选项?

注意:使用:

CMake 3.5.2

Apple LLVM 版本 7.3.0 (clang-703.0.31)

最佳答案

project()调用,CMake 检测编译器(执行 cmake 时您可能会看到相应的消息)并为其设置默认标志。这些标志存储在变量 CMAKE_CXX_FLAGS 中(常见)和 CMAKE_CXX_FLAGS_<CONFIG> (特定于配置)。

您可以根据需要修改这些变量:

1) 完全重写它们

set(CMAKE_CXX_FLAGS "<desired-value>")

2) 向它们附加新标志

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} <additional-flags>")

3) 从中删除特定值

string(REPLACE "<unwanted-flag>" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
# or
string(REGEX REPLACE "<unwanted-flag-regex>" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})

等等。

关于c++ - 从 Cmake 创建 Xcode 项目包含不需要的编译器标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37550199/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com