CMAKE: switch between clang / g++ and libc++ /libstdc++
It's a little tricky because I don't believe CMake has a built in way to select a standard library. What I do is pass it into the linker flags. e.g.
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++ -lc++abi")
CMake does, however, support setting the compiler:
set(CMAKE_CXX_COMPILER "clang++")

user965972
Updated on June 14, 2022Comments
-
user965972 12 months
This is my first cmake file. I have a linux system with both clang and g++. Also libc++ is installed. I develop on Mac (xcode) but deploy to linux. I am writing a cmake file in which I can pick either clang or g++ and libc++ or libstdc++. So 4 possible combinations.
I figured out how to select the compiler and force c++11 on it, but I can't figure out how to specify the standard library. Any suggestions?
This is what I have so far:
## 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})
I run this command on a console
../Project/Build$ rm -r *; rm -r ../Products/*; cmake ..; make VERBOSE=1;
My folder structure is:
Project Source Build Products CMakeLists.txt
I have also noticed that the compiler flags are sometimes ignored and only used when I run cmake and make a second time.
Also, I use a lot of
#warning todo
in my code How can I disable these warnings during compilation?