CMAKE: switch between clang / g++ and libc++ /libstdc++

10,263

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++")
Share:
10,263
user965972
Author by

user965972

Updated on June 14, 2022

Comments

  • user965972
    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?