CMAKE指定不同的源目录

时间:2016-06-30 15:07:01

标签: c++ gcc boost cmake

我有以下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文件中的gcc文件夹? (我认为在cmake中默认设置了一些编译器等路径,我想覆盖它们。)

3 个答案:

答案 0 :(得分:1)

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

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

如果您已经配置了某个环境(编译器的路径等)并想要更改它,最安全的方法是核对二进制目录并重新开始。你可能只是吹掉了CMakeCache.txtCMakeFiles目录,但我不认为100%安全。

答案 1 :(得分: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)

这将搜索libname.a中的/my/path/to/lib,如果找到,则将结果存储在${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 :(得分:1)

非标准编译器设置

可以更改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库是Kitware自己的boost脚本支持部分。在致电BOOST_ROOT之前,请尝试设置BOOSTROOTfind_package( Boost )https://cmake.org/cmake/help/cmake2.6docs.html#module:FindBoost