【问题标题】:CMAKE specifying different source directoriesCMAKE 指定不同的源目录
【发布时间】:2016-06-30 15:07:01
【问题描述】:

我有以下 cmake 文件:

cmake_minimum_required(VERSION 2.6)
project(azure)

set(CMAKE_CXX_FLAGS_DEBUG "-Og -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "-O2")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pipe -fmax-errors=2 -stdlib=libc++ -std=c++11 -Wall -Wextra -pedantic -Wno-unused-parameter -Wno-overloaded-virtual -Wno-deprecated-declarations $ENV{EXTRA_CXX_FLAGS}")

set(EXECUTABLE_OUTPUT_PATH ../run)
set(local_lib_path "/Users/User1/Downloads/")

include_directories("src")
include_directories(SYSTEM ${Boost_INCLUDE_DIRS})

file(GLOB azure_sources src/*.cpp src/module/*/*.cpp)

file(GLOB test_sources src/*.cpp src/util/*.cpp src/module/*/*.cpp src/test/*)
find_package(Boost COMPONENTS system filesystem unit_test_framework timer REQUIRED)
add_executable(sim_test ${test_sources})
target_link_libraries(sim_test ${Boost_FILESYSTEM_LIBRARY} ${Boost_SYSTEM_LIBRARY} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY} ${Boost_TIMER_LIBRARY})

由于权限问题,我在默认文件夹以外的文件夹中安装了 boost 和 gcc/g++。目前,上面的 cmake 文件尝试从默认的 (/usr/bin/) 中选择编译器和 boost 库,它们具有较旧的版本。

所以我只想问如何在上面的 cmake 文件中指定那些新的 boost & gcc 文件夹? (我认为在 cmake 中默认设置了一些编译器等路径,我想覆盖那些)。

【问题讨论】:

    标签: c++ gcc boost cmake


    【解决方案1】:

    指定编译器版本:

    查看Compilers and Tools 部分以获取有关如何指定要使用的编译器的信息。

    CMAKE_C_COMPILERCMAKE_CXX_COMPILER

    这些是在调用cmake时在命令行中指定的:

    cmake -DCMAKE_C_COMPILER=gcc-5.1
    

    在非标准位置查找库:

    find_library 采用PATHS 参数,允许您指定搜索位置。

    或者,find_package for boost 采用BOOST_LIBRARYDIR 参数,可以帮助您指定查看位置。


    这是一个小辅助函数,它允许您在文件系统的任何位置搜索静态或共享库。

    用法如下:

    find_static_lib(
        libname 
        LIB_NAME 
        PATHS
            /my/path/to/lib)
    

    这将在/my/path/to/lib中搜索libname.a,如果找到,将结果存储在${LIB_NAME}

    来源:

    function(do_find_lib LIB_NAME SUFFIX OUT)
        # - searches for a library with a given suffix, optionally in paths
        #
        # arguments:
        # LIB_NAME lib_name
        # SUFFIX   suffix
        # OUT      output variable
        # PATHS    search paths*
    
        # parse arguments
        set(options)
        set(values)
        set(lists   PATHS)
        cmake_parse_arguments(FIND "${options}" "${values}" "${lists}" "${ARGN}")
    
        set(CMAKE_FIND_LIBRARY_SUFFIXES ${SUFFIX})
    
        find_library(
            FOUND_${LIB_NAME}${SUFFIX} 
            ${LIB_NAME}
            PATHS
                ${FIND_PATHS}
            )
    
        if(NOT FOUND_${LIB_NAME}${SUFFIX})
            message(SEND_ERROR "unable to find library ${LIB_NAME}")
        endif()
    
        set(${OUT} ${FOUND_${LIB_NAME}${SUFFIX}} PARENT_SCOPE)
    
    endfunction()
    
    #####################################################################################
    
    function(find_static_lib LIB_NAME OUT)
        # arguments:
        # LIB_NAME lib_name
        # OUT      output variable
        # PATHS    search paths*
    
        # parse arguments
        set(options)
        set(values)
        set(lists   PATHS)
        cmake_parse_arguments(FIND "${options}" "${values}" "${lists}" "${ARGN}")
    
        if (WIN32 OR MSVC)
            set(SUFFIX ".lib")
        elseif (UNIX)
            set(SUFFIX ".a")
        endif()      
    
        do_find_lib(
            ${LIB_NAME} 
            ${SUFFIX} 
            FOUND 
            PATHS
                ${FIND_PATHS})
    
        set(${OUT} ${FOUND} PARENT_SCOPE)
    
    endfunction()
    
    #####################################################################################
    
    function(find_shared_lib LIB_NAME OUT)
        # arguments:
        # LIB_NAME lib_name
        # OUT      output variable
        # PATHS    search paths*
    
        # parse arguments
        set(options)
        set(values)
        set(lists   PATHS)
        cmake_parse_arguments(FIND "${options}" "${values}" "${lists}" "${ARGN}")
    
        if (WIN32 OR MSVC)
            set(SUFFIX ".dll")
        elseif (UNIX)
            set(SUFFIX ".so")
        endif()      
    
        do_find_lib(
            ${LIB_NAME} 
            ${SUFFIX} 
            FOUND 
            PATHS
                ${FIND_PATHS})
    
        set(${OUT} ${FOUND} PARENT_SCOPE)
    
    endfunction()
    

    【讨论】:

      【解决方案2】:

      编译器设置不是 CMake 文件的责任;它必须在 CMake 运行之前发生。 CMake 的设计使其假定它在为您要使用的构建工具正确配置的环境中运行。

      这意味着您应该设置环境变量,例如 CCCXX(以及您需要的任何其他变量,例如 PATH在运行 CMake 之前。然后 CMake 会根据这个环境选择编译器。

      如果您已经配置了某个环境(编译器的路径等)并且想要更改它,最安全的方法是删除二进制目录并重新开始。您可能会通过删除 CMakeCache.txtCMakeFiles 目录而侥幸逃脱,但我认为这不是 100% 安全的。

      【讨论】:

        【解决方案3】:

        非标准编译器设置

        可以更改您的 CMakeLists.txt 中的编译器路径,但它很挑剔,不推荐。更改 CMake 编译器的正确方法是创建并指定所谓的工具链文件。工具链文件只运行一次,语法和命令与 CMakeLists.txt 相同。

        例如,我有一个clang_toolchain.cmake 文件:

        SET( CMAKE_SYSTEM_NAME Linux )
        
        FIND_FILE( CLANG_C_BIN clang | NAMES clang-3.4 clang-3.5
                   PATHS /bin /usr/bin /usr/local/bin
                   HINTS ENV PATH )
        FIND_FILE( CLANG_CXX_BIN clang++ | NAMES clang++-3.4 clang++-3.5
                   PATHS /bin /usr/bin /usr/local/bin
                   HINTS ENV PATH )
        MARK_AS_ADVANCED( CLANG_C_BIN CLANG_CXX_BIN )
        
        SET( CMAKE_C_COMPILER ${CLANG_C_BIN} )
        SET( CMAKE_CXX_COMPILER ${CLANG_CXX_BIN} )
        

        这看起来很正常,但您可以轻松修改它以搜索本地安装的 gcc 和 g++ 副本:

        SET( CMAKE_SYSTEM_NAME Linux )
        
        FIND_FILE( C_BIN gcc
                   PATHS ~/local/bin )
        FIND_FILE( CXX_BIN g++
                   PATHS ~/local/bin )
        MARK_AS_ADVANCED( C_BIN CXX_BIN )
        
        SET( CMAKE_C_COMPILER ${C_BIN} )
        SET( CMAKE_CXX_COMPILER ${CXX_BIN} )
        

        它希望您的gccg++ 副本分别位于~/local/bin/

        您可以(如果您使用工具链,则必须)在创建缓存时指定工具链。

        cmake -DCMAKE_TOOLCHAIN_FILE:PATH={PATH_TO_TOOLCHAIN_FILE} {PATH_TO_CMakeLists.txt}
        

        非标准 Boost 位置

        在非标准位置定位 boost 库是 Kitware 自己的 boost 查找脚本支持的一部分。在调用find_package( Boost ) 之前尝试设置BOOST_ROOTBOOSTROOThttps://cmake.org/cmake/help/cmake2.6docs.html#module:FindBoost

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-05
          • 1970-01-01
          • 1970-01-01
          • 2014-12-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多