связывание ошибок после попытки включить boost в проект cmake - PullRequest
1 голос
/ 24 сентября 2019

Я пытался включить boost в мой проект cmake, и у меня возникли некоторые трудности с компиляцией проекта.В частности, я хотел бы использовать вещи, определенные в заголовке boost/filesystem.hpp.

Я установил boost, используя apt install libboost-all-dev, и я попытался внести необходимые изменения в файлы cmake в нужных местах, как рекомендовано в нескольких сообщениях на этом сайте.Тем не менее, следующий CMakeLists.txt файл не работает для меня (есть несколько, но это единственный, который должен ссылаться на новые заголовки и библиотеки повышения):

project(run_backtest)

add_subdirectory(markets)
set(SOURCE_FILES main.cpp)


set(Boost_USE_STATIC_LIBS OFF) 
set(Boost_USE_MULTITHREADED ON)  
set(Boost_USE_STATIC_RUNTIME OFF) 
find_package(Boost 1.65.1 COMPONENTS system filesystem) 

find_package (Eigen3 3.3 REQUIRED NO_MODULE)

include_directories(${Boost_INCLUDE_DIRS})

link_directories( ${Boost_LIBRARIES})

find_library(mysqlcppconn 1.1.12 REQUIRED)

add_executable(run_backtest ${SOURCE_FILES})
target_link_libraries(run_backtest markets Eigen3::Eigen stdc++fs mysqlcppconn ${Boost_LIBRARIES})
install(TARGETS run_backtest DESTINATION ${MARKETS_INSTALL_BIN_DIR})

Я перехожу в каталогназывается ~/markets/build/manual и введите cmake ../...Похоже, это работает;это распечатывает это:

taylor@taylor-XPS-13-9365:~/markets/build/manual$ cmake ../..
-- The C compiler identification is GNU 7.4.0
-- The CXX compiler identification is GNU 7.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Boost version: 1.65.1
-- Found the following Boost libraries:
--   system
--   filesystem
/usr/lib/x86_64-linux-gnu/libboost_system.so/usr/lib/x86_64-linux-gnu/libboost_filesystem.so
-- Configuring done
-- Generating done
-- Build files have been written to: /home/taylor/markets/build/manual

Тогда make && make install приводит к некоторым undefined reference to ошибкам.Вот первая копия / вставка:

../src/markets/libmarkets.a(data_readers.cpp.o): In function `number_of_files_in_directory(boost::filesystem::path)':
data_readers.cpp:(.text+0x28b): undefined reference to `boost::filesystem::detail::directory_iterator_construct(boost::filesystem::directory_iterator&, boost::filesystem::path const&, boost::system::error_code*)'

Верх файла data_readers.h выглядит следующим образом:

.
.
.
#include <string>
#include <vector>
#include <queue>
#include <boost/filesystem.hpp>
.
.
.

Просмотр cmake docs ,Я заметил, что существует огромное количество переменных, которые дают каталог библиотеки.Возможно, я использую один рабочий?

1 Ответ

1 голос
/ 25 сентября 2019

Здесь я внес несколько изменений в ваш CMakeLists.txt и добавил несколько комментариев для ясности.

project(run_backtest)

add_subdirectory(markets)
set(SOURCE_FILES main.cpp)

# You shouldn't need these, i got my copy working without them 
# set(Boost_USE_STATIC_LIBS OFF) 
# set(Boost_USE_MULTITHREADED ON)  
# set(Boost_USE_STATIC_RUNTIME OFF) 
# Here i added 'Required' so that the build will fail if it cannot find boost
find_package(Boost 1.65.1 REQUIRED COMPONENTS system filesystem) 

find_package (Eigen3 3.3 REQUIRED NO_MODULE)

# You shouldn't have to use find_library, it's a lower level command
# and find_package should encapsulate it's functionality
find_package (mysqlcppconn 1.1.12 REQUIRED)

add_executable(run_backtest ${SOURCE_FILES})

# Here i replaced the variables (e.g ${BOOST_Libraries}) with Boost::system
# This is called an 'alias'. They're added by the Find_Package() call.
target_link_libraries(run_backtest markets
    Eigen3::Eigen
    stdc++fs
    mysqlcppconn
    Boost::system)
install(TARGETS run_backtest DESTINATION ${MARKETS_INSTALL_BIN_DIR})
...