После прочтения многих вопросов 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.
Пожалуйста вывесить выход полной ссылки линии от VERBOSE = 1 – xaxxon
Компоновщика требует '.a' файлова а не '.so'. Если вы установили в своей системе, попробуйте найти locboost_system.a', чтобы найти его. – kenba
cxxflags, как правило, для компиляции, для связи может быть лучше использовать что-то вроде ldflags или что-то еще, что называется в cmake. –