我有以下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中默认设置了一些编译器等路径,我想覆盖它们。)
答案 0 :(得分:1)
编译器设置不是CMake文件的责任;它必须在CMake运行之前发生。 CMake的设计使其假定它在为您要使用的构建工具正确配置的环境中运行。
这意味着您应该在运行CMake之前设置环境变量,例如CC
和CXX
(以及您需要的任何其他内容,例如PATH
)。然后,CMake将根据此环境选择编译器。
如果您已经配置了某个环境(编译器的路径等)并想要更改它,最安全的方法是核对二进制目录并重新开始。你可能只是吹掉了CMakeCache.txt
和CMakeFiles
目录,但我不认为100%安全。
答案 1 :(得分:1)
指定编译器版本:
查看Compilers and Tools部分,了解有关如何指定要使用的编译器的信息。
即CMAKE_C_COMPILER
和CMAKE_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} )
分别要求gcc
和g++
的副本位于~/local/bin/
。
您可以(并且必须在使用工具链时)在创建缓存时指定工具链。
cmake -DCMAKE_TOOLCHAIN_FILE:PATH={PATH_TO_TOOLCHAIN_FILE} {PATH_TO_CMakeLists.txt}
在非标准位置定位boost库是Kitware自己的boost脚本支持部分。在致电BOOST_ROOT
之前,请尝试设置BOOSTROOT
或find_package( Boost )
。
https://cmake.org/cmake/help/cmake2.6docs.html#module:FindBoost