CMAKE:在clang / g ++和libc ++ / libstdc ++之间切换

时间:2017-04-27 16:04:43

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

这是我的第一个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 如何在编译期间禁用这些警告?

2 个答案:

答案 0 :(得分:4)

这有点棘手,因为我不相信CMake有选择标准库的内置方式。我所做的是将其传递给链接器标志。 e.g。

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

CMake 支持设置编译器:

set(CMAKE_CXX_COMPILER "clang++")

答案 1 :(得分:-5)

CMake范例是允许用户在配置项目时选择编译器。您不必在CMakeLists.txt中进行任何额外的工作来实现这一目标。使用CMake GUI构建项目时,您将能够从下拉列表中选择编译器。如果使用命令行,则需要使用-G开关。请参阅man cmakehttps://cmake.org/cmake/help/v3.0/manual/cmake-generators.7.html