2017-01-08 2 views
1

У меня проблемы с файловой системой Boost lib (1.60.0). Проведя пару часов, разрывая мой код, полагая, что это то, что я делал неправильно, я попробовал использовать собственные примеры файловой системы Boost и имел ту же проблему. Все это отлично работает при компиляции с gcc на OSX, но не на Ubuntu 14.04.Неопределенная ошибка ссылки с boost :: filesystem, несмотря на использование BOOST_NO_CXX11_SCOPED_ENUMS

Я попытался определить BOOST_NO_CXX11_SCOPED_ENUMS как в коде, так и попробовал его как аргумент при запуске g ++. Я также попытался удалить -std = C++ 11 (я видел в одном случае, что, казалось, помогло кому-то, кто столкнулся с этой проблемой). Несмотря на это, он всегда терпит неудачу на Ubuntu. Пример подталкивания Я использую это:

// tut1 
#include <iostream> 

#define BOOST_NO_CXX11_SCOPED_ENUMS 
#include <boost/filesystem.hpp> 
using namespace boost::filesystem; 

int main(int argc, char* argv[]) 
{ 
    if (argc < 2) 
    { 
    std::cout << "Usage: tut1 path\n"; 
    return 1; 
    } 
    std::cout << argv[1] << " " << file_size(argv[1]) << '\n'; 
    return 0; 
} 

И результат попытки скомпилировать который выглядит следующим образом:

[email protected]:~/boost_fs_test$ g++ -I/boost/1_60_0/include -L/boost/1_60_0/lib -lboost_system -lboost_filesystem test2.cpp -o test2 
/tmp/cck0AVVX.o: In function `__static_initialization_and_destruction_0(int, int)': 
test2.cpp:(.text+0x105): undefined reference to `boost::system::generic_category()' 
test2.cpp:(.text+0x111): undefined reference to `boost::system::generic_category()' 
test2.cpp:(.text+0x11d): undefined reference to `boost::system::system_category()' 
/tmp/cck0AVVX.o: In function `boost::filesystem::file_size(boost::filesystem::path const&)': 
test2.cpp:(.text._ZN5boost10filesystem9file_sizeERKNS0_4pathE[_ZN5boost10filesystem9file_sizeERKNS0_4pathE]+0x19): undefined reference to `boost::filesystem::detail::file_size(boost::filesystem::path const&, boost::system::error_code*)' 
collect2: error: ld returned 1 exit status 

[email protected]:~/boost_fs_test$ g++ -std=c++11 -I/boost/1_60_0/include -L/boost/1_60_0/lib -lboost_system -lboost_filesystem test2.cpp -o test2 
/tmp/cceGCjpc.o: In function `__static_initialization_and_destruction_0(int, int)': 
test2.cpp:(.text+0x105): undefined reference to `boost::system::generic_category()' 
test2.cpp:(.text+0x111): undefined reference to `boost::system::generic_category()' 
test2.cpp:(.text+0x11d): undefined reference to `boost::system::system_category()' 
/tmp/cceGCjpc.o: In function `boost::filesystem::file_size(boost::filesystem::path const&)': 
test2.cpp:(.text._ZN5boost10filesystem9file_sizeERKNS0_4pathE[_ZN5boost10filesystem9file_sizeERKNS0_4pathE]+0x19): undefined reference to `boost::filesystem::detail::file_size(boost::filesystem::path const&, boost::system::error_code*)' 
collect2: error: ld returned 1 exit status 

Я тройной проверил, как я установил подталкивание и все выглядит правильно. В ЛИЭС, безусловно, в нужном месте:

-rw-rw-r-- 1 vagrant vagrant 237886 Jan 8 08:41 libboost_filesystem.a 
lrwxrwxrwx 1 vagrant vagrant  29 Jan 8 08:40 libboost_filesystem.so -> libboost_filesystem.so.1.60.0 
-rwxrwxr-x 1 vagrant vagrant 126186 Jan 8 08:40 libboost_filesystem.so.1.60.0 
-rw-rw-r-- 1 vagrant vagrant 49226 Jan 8 08:41 libboost_system.a 
lrwxrwxrwx 1 vagrant vagrant  25 Jan 8 08:40 libboost_system.so -> libboost_system.so.1.60.0 
-rwxrwxr-x 1 vagrant vagrant 20469 Jan 8 08:40 libboost_system.so.1.60.0 

точно такой же код компилируется отлично на OSX, хотя:

jack-burton:boost_fs fny$ g++ -std=c++11 -I/usr/local/Cellar/boost/1.60.0_1/include -L/usr/local/Cellar/boost/1.60.0_1/lib -lboost_system -lboost_filesystem test2.cpp -o test2 
jack-burton:boost_fs fny$ ls 
test2  test2.cpp 
jack-burton:boost_fs fny$ ./test2 test2.cpp 
test2.cpp 321 

Я не совсем уверен, что я здесь отсутствует. Ради любопытства я попытался использовать apt для установки Boost (который установил 1.54) и имел ту же проблему.

ответ

0

это выглядит, как вы связываете против повышения скомпилированного как разделяемая библиотека, попробуйте скомпилировать с -DBOOST_ALL_DYN_LINK или явно компиляцией подталкивания как статическая библиотека ./b2 link=static

+0

Не повезло ни с чем, кажется. Сначала я попробовал BOOST_ALL_DYN_LINK. Затем я попытался добавить ссылку = static при запуске b2 снова. Я вижу, что теперь есть файлы .a в папке lib, но все равно не удается скомпилировать тестовый код с той же ошибкой, что и раньше. – fny82

+0

Вы уверены, что пути включения верны? эти пути в вашей команде сборки, похоже, указывают на то, что вы устанавливаете boost в корневой каталог и переставляете включенные пути, что кажется необычным. вы пытались сделать это обычным способом 'sudo ./b2 install'? – PhantomPilot

+0

Да, путь/boost, который я пытался, определенно был прав. Я не пытался установить его без указания места установки, поэтому я просто попробовал его с помощью 'sudo ./b2 install' без каких-либо других параметров. С и без явно передавая путь для включения и lib в/usr/local при попытке скомпилировать тестовую программу, возникает та же проблема. :(Соответствующие библиотеки находятся там под/usr/local/lib. – fny82

2

Хорошо, я понял это с какими-то расстраивает проб и ошибками. :)

На обоих CentOS и Ubuntu, я получил это работает путем установки подталкивание следующим образом:

sudo ./b2 install link=static --with-system --with-filesystem

Затем компиляции с:

g++ -std=c++11 -I/usr/local/include -L/usr/local/lib test.cpp -lboost_system -lboost_filesystem -o test

Ключ, кажется, расположение libs в команде gcc. Поставить их после исходных файлов, казалось, сделали трюк. Я был в состоянии полностью вырвать Boost из проекта, но, к счастью, это сработало и избавило меня от необходимости переписывать честный код. Вероятно, это невероятно глупая ошибка, но TIL ...

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