【问题标题】:CMAKE: switch between clang / g++ and libc++ /libstdc++CMAKE:在 clang / g++ 和 libc++ /libstdc++ 之间切换
【发布时间】:2017-09-25 12:59:21
【问题描述】:

这是我的第一个 cmake 文件。我有一个带有 clang 和 g++ 的 linux 系统。还安装了 libc++。我在 Mac (xcode) 上开发,但部署到 linux。 我正在编写一个 cmake 文件,我可以在其中选择 clang 或 g++ 以及 libc++ 或 libstdc++。所以有 4 种可能的组合。

我想出了如何选择编译器并对其强制使用 c++11,但我不知道如何指定标准库。有什么建议吗?

这是我目前所拥有的:

## cmake ###
cmake_minimum_required (VERSION 3.5)

#set project directories
set(ProjectDirectory ${CMAKE_SOURCE_DIR}) #.../Project/
set(BuildDirectory ${ProjectDirectory}/Build)
set(ProductDirectory ${ProjectDirectory}/Products)
set(sourceDirectory ${ProjectDirectory}/Source)

#print project directories
message(${ProjectDirectory})
message(${BuildDirectory})
message(${ProductDirectory})

#configure cmake
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${ProductDirectory})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${ProductDirectory})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${ProductDirectory})

set(CMAKE_VERBOSE_MAKEFILE on)

#compiler and standard library settings
set(CMAKE_CXX_COMPILER "clang++")
set(CMAKE_CXX_STANDARD 11)
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -v -stdlib=libc++")
        #libstdc++ #linux
        #libc++    #OS X

#compiler flags
SET( CompilerFlags  " ")
#SET( CompilerFlags  "${CompilerFlags} -stdlib=libc++" )
SET( CompilerFlags  "${CompilerFlags} -Wno-unknown-pragmas" )
SET( CompilerFlags  "${CompilerFlags} -Wall" )
SET( CompilerFlags  "${CompilerFlags} -Wextra" )

set (CMAKE_CXX_FLAGS ${CompilerFlags})

#linker flags
#set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++ -lc++abi")

#message(${CMAKE_CXX_FLAGS})

##################
### Libraries ###
################
### common library ###
project(common)

#message(STATUS ${CMAKE_CXX_FLAGS})

#source files
#set (commonSource ${sourceDirectory}/Object/object.cpp) #specify specific files
file(GLOB_RECURSE commonSource ${sourceDirectory}/Object/*.cpp) # recursive

#targets
add_library (common STATIC ${commonSource})

#target_compile_options (common PUBLIC ${CompilerFlags})


#####################
### Applications ###
###################
### Hello project ###
project (hello)

#source files
#set (helloSource ${sourceDirectory}/main.cpp)

#targets
#add_executable (hello ${helloSource})

#linking
#target_link_libraries (hello common)


#install(TARGETS common DESTINATION ${ProductDirectory})

我在控制台上运行这个命令

../Project/Build$ rm -r *; rm -r ../Products/*; cmake ..; make VERBOSE=1;

我的文件夹结构是:

Project
    Source
    Build
    Products
    CMakeLists.txt

我还注意到编译器标志有时会被忽略,并且仅在我运行 cmake 并再次运行时使用。

另外,我在代码中使用了很多 #warning todo 如何在编译期间禁用这些警告?

【问题讨论】:

  • 编译器的选择通常在项目的CMakeLists.txt 之外。相关问题描述了如何做到这一点。至于 libc++ 库,它的选择也可以看作是单独的编译环境,所以很自然地将这个选择移到项目的CMakeLists.txt 之外。
  • 好吧,这很不寻常。但我不在乎这是不寻常的。我只是希望它按照我想要的方式工作。那么,如果可以的话,怎么做呢?
  • 如果你要设置变量CMAKE_CXX_FLAGS,在project()调用之前应该设置为CMAKE_CXX_FLAGS_INIT
  • 有更好的方法来指定使用 C++11 并让 CMake 选择合适的 C++ 库来链接。简而言之,目标属性 CXX_STANDARDCXX_STANDARD_REQUIREDCXX_EXTENSIONS 是您想要的(和/或它们的 CMake 变量对应项)。可以在here 找到一篇深入解释它的文章。编译器的选择实际上应该留给开发人员,除非您出于某种原因确实需要一个而不是另一个。
  • 我的代码在 OS X 上编译和运行都很好。但是在 linux 上编译是一场噩梦。我被告知 linux c++ 库还没有完全实现 c++11 标准。所以我想尝试 clang 和 libc++ 而不是 gcc 和 libstdc++。坦率地说,我不关心编译器,只要它运行。

标签: cmake g++ clang++ libstdc++ libc++


【解决方案1】:

这有点棘手,因为我不相信 CMake 有内置的方法来选择标准库。我所做的是将它传递给链接器标志。例如

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++ -lc++abi")

CMake 确实,但是,支持设置编译器:

set(CMAKE_CXX_COMPILER "clang++")

【讨论】:

  • 最好使用完整路径。在 linux 上,我收到以下错误:tests/CMakeLists.txt:6 (project) 的 CMake 错误:CMAKE_CXX_COMPILER: clang++ is not a full path and is not found in the PATH.通过将环境变量“CXX”或 CMake 缓存条目 CMAKE_CXX_COMPILER 设置为编译器的完整路径或编译器名称(如果它在 PATH 中),告诉 CMake 在哪里可以找到编译器。 -- 配置不完整,出现错误!
  • 无论如何它对我不起作用:makefile 的创建锁定在一个永恒的循环中
  • 我不同意,将编译器添加到您的 PATH 是更被接受和更好的做事方式。它使代码重用变得更容易,并且不会将开发环境设置硬编码到源代码中。如果需要指定完整路径,最好在运行 CMake 时使用 -D 进行设置。 cmake -D CMAKE_CXX_COMPILER "/path/to/your/cpp/compiler/executable" /path/to/directory/containing/CMakeLists.txt您提到的生成递归与编译器变量没有任何关系。在别处寻找问题。
  • 编译器在我的路径中。尽管如此,我还是收到了错误消息。我的工具版本可能有问题。
猜你喜欢
  • 1970-01-01
  • 2017-01-03
  • 2011-10-25
  • 2012-02-18
  • 2018-05-10
  • 1970-01-01
  • 1970-01-01
  • 2013-11-12
  • 1970-01-01
相关资源
最近更新 更多