2015-11-02 2 views
0

Код компилируется и ссылки просто отлично под Windows, однако на Ubuntu при использовании конструктора boost::timer::auto_cpu_timer timer(short, string); соединение не удалось.Strange Boost auto_cpu_timer неопределенная эталонная ошибка

Кроме того, также странно, что в Windows мне не нужно ссылаться на библиотеку ускорения chrono, но на Ubuntu требуется.

main.cpp

#include <boost/timer/timer.hpp> 
int main() 
{ 
// Link Failed! 
// 
// main.cpp:(.text.startup+0x96): 
// undefined reference to 
// `boost::timer::auto_cpu_timer::auto_cpu_timer(
//  short, 
//  std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) 
// ' 
boost::timer::auto_cpu_timer timer(3, "Wall time: %w seconds\n"); 


// Link OK 
boost::timer::auto_cpu_timer timer2; 

return 0; 
} 

CMakeLists.txt

cmake_minimum_required(VERSION 3.0) 
project(auto_cpu_timer_test) 
aux_source_directory(. SRC_LIST) 

# Setup Boost 
if (WIN32) 
    set(BOOST_LIBRARYDIR C:/boost_1_59_0/stage/lib) 
    set(BOOST_INCLUDEDIR C:/boost_1_59_0) 
else() 
    set(BOOST_LIBRARYDIR /home/me/boost_1_59_0/stage/lib) 
    set(BOOST_INCLUDEDIR /home/me/boost_1_59_0) 
endif() 

set(Boost_USE_STATIC_LIBS ON) 
set(Boost_USE_MULTITHREADED ON) 
set(Boost_USE_STATIC_RUNTIME ON) 
link_directories(${LINK_DIRECTORIES} ${BOOST_LIBRARYDIR}) 
include_directories(${INCLUDE_DIRECTORIES} ${BOOST_INCLUDEDIR}) 

set(CMAKE_BUILD_TYPE "Release") 

if(WIN32) 
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd") 
    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT") 
else() 
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 
endif() 

add_executable(${PROJECT_NAME} ${SRC_LIST}) 

if (WIN32) 
    target_link_libraries(${PROJECT_NAME} libboost_system-vc140-mt-s-1_59.lib libboost_timer-vc140-mt-s-1_59.lib) 
else() 
    target_link_libraries(${PROJECT_NAME} libboost_system-mt-s.a libboost_timer-mt-s.a libboost_chrono-mt-s.a) 
endif() 

ответ

2

Наиболее вероятной причиной является то, что ваш подталкивания не встраивается в режиме C++ 11, но ваше приложение построено с явным - станд = C++ 11.

Вы можете удалить «bin.b2» и «сценические» каталоги, и попробуйте еще раз с:

b2 ... cxxflags=-std=c++11 linkflags=-std=c++11 

Причина это не проблема на Windows, то, что Visual Studio имеет C++ 11 на по по умолчанию. Причина, по которой вам не нужно связывать хроно в Windows, скорее всего, связана с автолинкой - вы добавляете библиотеки ускорений в путь поиска библиотек, и вы не отключите автозапуск, поэтому все необходимые библиотеки включаются автоматически.

+0

Вы правы! Вы решили мою проблему! Большое спасибо!!! – grayfox

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