2016-04-01 3 views
1

Чтобы предотвратить ошибки «неопределенной ссылки на ...», мне нужно добавить библиотеки boost в самом конце флагов компилятора. Поэтому в CMakeLists.txt я установил:Измените порядок флагов компилятора

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pedantic -O0 -Wall -DBOOST_SYSTEM_NO_DEPRECATED -lboost_system -lboost_filesystem") 

Однако подробный вывод CMake показывает мне, что дополнительные флаги добавляются за них я определил:

g++ -std=c++11 -pedantic -O0 -Wall -DBOOST_SYSTEM_NO_DEPRECATED -lboost_system -lboost_filesystem CMakeFiles/My_Project.dir/main.cpp.o -o My_Project -L/usr/local/boost_1_60_0/lib 

Можно ли изменить порядок?

Полный CMakeLists.txt:

cmake_minimum_required(VERSION 3.4) 
project(My_Project) 

set(CMAKE_VERBOSE_MAKEFILE ON) 

# This is bad but I currently don't have another working solution. 
set(BOOSTROOT "/usr/local/boost_1_60_0/") 
set(BOOST_ROOT "/usr/local/boost_1_60_0/") 

find_package(Boost 1.60.0 COMPONENTS system filesystem REQUIRED) 
if(Boost_FOUND) 

    message(STATUS "Boost_INCLUDE_DIRS: ${Boost_INCLUDE_DIRS}") 
    message(STATUS "Boost_LIBRARIES: ${Boost_LIBRARIES}") 
    message(STATUS "Boost_VERSION: ${Boost_VERSION}") 

    link_directories(${Boost_LIBRARY_DIRS}) 
    include_directories(${Boost_INCLUDE_DIRS}) 

endif() 

add_executable(BoostTest main.cpp) 

if(Boost_FOUND) 

    target_link_libraries(BoostTest ${Boost_LIBRARIES}) 

endif() 

# Boost libraries appended at the end. However, cmake generates flags like this: 
# c++ -std=c++11 -pedantic -O0 -Wall -DBOOST_SYSTEM_NO_DEPRECATED -lboost_system -lboost_filesystem CMakeFiles/My_Project.dir/main.cpp.o -o My_Project -L/usr/local/boost_1_60_0/lib 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pedantic -O0 -Wall -DBOOST_SYSTEM_NO_DEPRECATED -lboost_system -lboost_filesystem") 
set(SOURCE_FILES main.cpp) 
add_executable(My_Project ${SOURCE_FILES}) 

Благодаря

+0

Вы никогда не должны изменять порядок флагов компилятора. Однако вам нужно перечислить библиотеки в правильном порядке в * значении * флага компоновщика. – EJP

ответ

1

Вы должны использовать target_link_libraries вместо того, чтобы вручную добавляя -lboost директивы в ваши флаги компилятора.

TARGET_LINK_LIBRARIES(My_Project boost) 

Следует также отметить, что это возможно, линкер может быть использована в качестве отдельного вызова после компиляции объектных файлов

+0

Это работало, спасибо! Мне пришлось добавить эту строку в самом конце CMakeLists.txt: 'target_link_libraries (My_Project boost_system boost_filesystem)' – haggis

Смежные вопросы