【问题标题】:Why my Cmake already choose clang (-x c++) instead of clang++ to compile the codes?为什么我的 Cmake 已经选择 clang (-x c++) 而不是 clang++ 来编译代码?
【发布时间】:2017-05-18 17:09:08
【问题描述】:

我的 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 然后 make 编译我的项目时,对于所有 .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++”看起来好像不生效。你能说出可能是什么原因吗?

谢谢。

【问题讨论】:

标签: cmake clang


【解决方案1】:

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 方法,则根本不需要更改链接器标志)。

【讨论】:

    猜你喜欢
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多