为什么我的Cmake已经选择了clang(-x c ++)而不是clang ++来编译代码?

时间:2017-05-18 17:09:09

标签: cmake clang

我在Toolchain.cmake中有以下设置

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_VERSION 1)
set(CMAKE_SYSTEM_PROCESSOR x86_64)

set(cross_triple "x86_64-linux-gnu")
set(clang_5.0 "/third_party/llvm-build/Release+Asserts")
set(clang_link_flags "-lstdc++")

set(CMAKE_C_COMPILER ${clang_5.0}/bin/clang)
set(CMAKE_CXX_COMPILER ${clang_5.0}/bin/clang++)
set(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER})
set(CMAKE_CXX_FLAGS "-std=c++11 -stdlib=libc++ -Wno-c++11-narrowing -v")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${clang_link_flags}")

而且,我的clang编译器文件夹如下:

-rwxr-xr-x 1 1024 1024 15774563 May 11 21:06 sancov
-rwxr-xr-x 1 1024 1024  3925178 May 11 21:06 llvm-symbolizer
-rwxr-xr-x 1 1024 1024 16048083 May 11 21:06 llvm-ar
-rwxr-xr-x 1 1024 1024 63993992 May 11 21:06 lld
-rwxr-xr-x 1 1024 1024 82308936 May 11 21:06 clang
lrwxrwxrwx 1 1024 1024        3 May 18 01:11 ld.lld -> lld
lrwxrwxrwx 1 1024 1024        5 May 18 01:11 clang-cl -> clang
lrwxrwxrwx 1 1024 1024        5 May 18 01:11 clang++ -> clang

一切看起来都不错。但是,当我使用Cmake然后编译我的项目时,对于所有.cpp .c文件,Cmake选择使用clang而不是clang ++来编译源代码,如:

“/ third_party / llvm-build / Release + Asserts / bin / clang”-cc1 -x c ++ xxx.cpp -o xxx.cpp.o

由于某种原因,“-lstdc ++”标志不会在链接器中生效,这会导致一些问题。

我的问题:

  1. 为什么cmake选择使用“clang -x c ++”而不是直接使用clang ++?这里有什么遗漏?如何让cmake选择clang ++?

  2. 在CMAKE_EXE_LINKER_FLAGS中定义“-lstdc ++”看起来不会生效。你能说出原因吗?

  3. 感谢。

1 个答案:

答案 0 :(得分:0)

它不应该是CMake使用clang -x c++的问题,它只是告诉clang前端将源代码编译为C ++。如果需要C ++ 11支持,您可能应该在项目的CMakeLists.txt文件中使用以下内容,而不是明确指定-std=c++11 -stdlib=libc++标志:

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

您可以找到有关如何设置C ++ 11及更高版本here的详细讨论。

至于您尝试设置的剩余编译器和链接器标志,您可能需要查看CMAKE_<LANG>_FLAGS_INITCMAKE_EXE_LINKER_FLAGS_INIT作为设置它们的替代方法。它们旨在用于工具链文件中以执行您尝试执行的操作(但如果您使用上面的C ++ 11方法,则根本不需要更改链接器标记)。