2016-04-19 5 views
1

После прочтения многих вопросов SO по этому вопросу я просто не мог заставить его работать. Я скачал boost_1_60_0, тогда я побежал команды, чтобы построить его:Ссылка на Boost на Ubuntu x64

sudo ./bootstrp.sh --prefix=/home/ricardo/boostlib 
sudo ./b2 install -j8 

Я даже попытался запустить b2 так:

sudo ./b2 install -j8 architecture=x86 address-model=64 

не имеет значения. Ошибка всегда одна и та же:

main.cpp:(.text+0x7e): undefined reference to `boost::system::generic_category()' 
main.cpp:(.text+0x8a): undefined reference to `boost::system::generic_category()' 
main.cpp:(.text+0x96): undefined reference to `boost::system::system_category()' 

Да, я знаю. Ошибка связи, должна работать с -lboost_system и всеми. Да, вы должны положить -L/home/ricardo/boostlib/lib. Я знаю.

Это то, что мой CMake выглядит следующим образом:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -L/home/ricardo/boostlib/lib -lboost_system -Wl,--verbose") 

include_directories("/home/ricardo/boostlib/include") 

Вы можете спросить: что выход -Wl,--verbose? Ну, что удивительно, libboost_system.so было найдено:

attempt to open /home/ricardo/boostlib/lib/libboost_system.so succeeded 
-lboost_system (/home/ricardo/boostlib/lib/libboost_system.so) 

Хорошо. Библиотека была найдена. Я все еще пытаюсь найти альтернативы, пока ничего не работает. Итак, хотя я связываю его с boost, и boost_system была найдена, программа все еще не компилируется из-за ... почему? Может ли кто-нибудь объяснить мне?

Редактировать: How to link C++ program with Boost using CMake, похоже, работает. Хотя мне все же хотелось бы знать, почему мой метод не работает, и что мне делать, когда я хочу связать с boost, используя только компилятор g ++, без CMake и Make. Я смог связать с Openblas успешно, поэтому мне интересно, почему он не работает с Boost.

Edit2: Это команда g ++, которую я получил после запуска make VERBOSE=1, теперь я вижу, что источники устанавливаются ПОСЛЕ зависимостей.

-std=c++11 -L/home/ricardo/boostlib/lib -lboost_system CMakeFiles/prophet-service.dir/main.cpp.o -o prophet-service -rdynamic 

И это мой текущий CMake файл:

cmake_minimum_required(VERSION 3.2) 
project(prophet-service) 
set(SOURCE_FILES 
    main.cpp) 
include_directories("/home/ricardo/boostlib/include") 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -L/home/ricardo/boostlib/lib -lboost_system") 
add_executable(prophet-service ${SOURCE_FILES}) 

Также кажется, что у меня нет файла libbost_system.a. По крайней мере, теперь я знаю, что мне нужен файл .a вместо файла .so.

+0

Пожалуйста вывесить выход полной ссылки линии от VERBOSE = 1 – xaxxon

+0

Компоновщика требует '.a' файлова а не '.so'. Если вы установили в своей системе, попробуйте найти locboost_system.a', чтобы найти его. – kenba

+0

cxxflags, как правило, для компиляции, для связи может быть лучше использовать что-то вроде ldflags или что-то еще, что называется в cmake. –

ответ

1

Вы подключаетесь в нужном порядке? Вещь, с которой нужна зависимость, предшествует тому, что удовлетворяет зависимость.

+0

Хм, я так думаю. Теперь я не уверен, я постараюсь понять, что делает Make за кулисами, но это будет иметь большой смысл. –

+1

make VERBOSE = 1 - это команда – xaxxon

+0

любая удача с получением командной строки вашего линкера? – xaxxon

0

Вам необходимо связать версию библиотеки с расширением .a, потому что для компоновщика требуется это расширение (используется для статических библиотек), а не .so, которое используется для разделяемых библиотек (то же самое с dll для Windows).

Например, если я ищу libboost_system.a на моей операционной системе Ubuntu Я нахожу следующее:

[email protected]:~$ locate libboost_system.a 
/home/frar/Documents/SVILUPPO/boost_1_59_0/bin.v2/libs/system/build/gcc-4.8/release/link-static/threading-multi/libboost_system.a 
/home/frar/Documents/SVILUPPO/boost_1_59_0/stage/lib/libboost_system.a 
/usr/lib/x86_64-linux-gnu/libboost_system.a 
Смежные вопросы