我在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 ++”标志不会在链接器中生效,这会导致一些问题。
我的问题:
为什么cmake选择使用“clang -x c ++”而不是直接使用clang ++?这里有什么遗漏?如何让cmake选择clang ++?
在CMAKE_EXE_LINKER_FLAGS中定义“-lstdc ++”看起来不会生效。你能说出原因吗?
感谢。
答案 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_INIT
和CMAKE_EXE_LINKER_FLAGS_INIT
作为设置它们的替代方法。它们旨在用于工具链文件中以执行您尝试执行的操作(但如果您使用上面的C ++ 11方法,则根本不需要更改链接器标记)。