Включение буст-библиотек в make-файлы - PullRequest
5 голосов
/ 20 августа 2009

Я изучаю Boost и у меня проблемы с моими файлами make. Вот мой основной make-файл:

accesstimer: acctime.o btimer.o
    g++ acctime.o btimer.o -o accesstimer

acctime.o: acctime.cpp btimer.h
    g++ -c acctime.cpp 

bentimer.o: btimer.cpp btimer.h
    g++ -c btimer.cpp 

Если в файле acctime.cpp нет элементов форсированной файловой системы, этот файл работает нормально. Как только я добавляю элементы файловой системы boost, мне, очевидно, нужно сделать ссылки на библиотеку boost в файле make, где у меня возникают проблемы.

Следующая строка работает для одного файла:

g++ -I /usr/local/boost/boost_1_39_0 boosttest1.cpp -o bt1 /usr/local/boost/boost_1_39_0/stage/lib/libboost_filesystem-gcc41-mt.a /usr/local/boost/boost_1_39_0/stage/lib/libboost_system-gcc41-mt.a

Теперь я пытаюсь интегрировать это в файл make. Я пробовал много, основываясь на том, какую информацию я могу найти в Интернете, но ни одна из них не работает, это мое последнее:

accesstimer: acctime.o bentimer.o
    g++ acctime.o bentimer.o -o accesstimer

acctime.o: acctime.cpp bentimer.h
    g++ -c -I /usr/local/boost/boost_1_39_0 acctime.cpp /usr/local/boost/boost_1_39_0/stage/lib/libboost_filesystem-gcc41-mt.a /usr/local/boost/boost_1_39_0/stage/lib/libboost_system-gcc41-mt.a

bentimer.o: bentimer.cpp bentimer.h
    g++ -c bentimer.cpp 

К сожалению, он не может найти библиотеки Boost, кто-нибудь может помочь? спасибо

Прочитав совет людей, которые ответили, я теперь получил это:

accesstimer: acctime.o bentimer.o
    g++ -L /usr/local/boost/boost_1_39_0 acctime.o /usr/local/boost/boost_1_39_0/stage/lib/libboost_filesystem-gcc41-mt.a /usr/local/boost/boost_1_39_0/stage/lib/libboost_system-gcc41-mt.a bentimer.o -o accesstimer

acctime.o: acctime.cpp bentimer.h
    g++ -c acctime.cpp 

bentimer.o: bentimer.cpp bentimer.h
    g++ -c bentimer.cpp 

Но это все равно не удается связать.

Это сообщение об ошибке, которое я получаю:

g++ -L /usr/local/boost/boost_1_39_0/stage/lib/libboost_filesystem-gcc41-mt.a /usr/local/boost/boost_1_39_0/stage/lib/libboost_system-gcc41-mt.a acctime.o  bentimer.o -o accesstimer
acctime.o: In function boost::enable_if<boost::filesystem::is_basic_path<boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> >, bool>::type boost::filesystem::exists<boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> >(boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> const&)':
acctime.cpp:(.text._ZN5boost10filesystem6existsINS0_10basic_pathISsNS0_11path_traitsEEEEENS_9enable_ifINS0_13is_basic_pathIT_EEbE4typeERKS7_[boost::enable_if<boost::filesystem::is_basic_path<boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> >, bool>::type boost::filesystem::exists<boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> >(boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> const&)]+0x26): undefined reference to `boost::filesystem::detail::status_api(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int&)'
collect2: ld returned 1 exit status
make: *** [accesstimer] Error 1

Следуя совету orsogufo (спасибо! Очень признателен), теперь есть:

accesstimer: acctime.o bentimer.o
    g++ -L/usr/local/boost/boost_1_39_0/stage/lib -llibboost_filesystem-gcc41-mt.a -llibboost_system-gcc41-mt.a acctime.o bentimer.o -o accesstimer  

acctime.o: acctime.cpp bentimer.h
    g++ -c acctime.cpp 

bentimer.o: bentimer.cpp bentimer.h
    g++ -c bentimer.cpp 

выглядит лучше, но все еще не может найти библиотеку:

g++ -L/usr/local/boost/boost_1_39_0/stage/lib -llibboost_filesystem-gcc41-mt.a -llibboost_system-gcc41-mt.a acctime.o bentimer.o -o accesstimer
/usr/bin/ld: cannot find -llibboost_filesystem-gcc41-mt.a
collect2: ld returned 1 exit status
make: *** [accesstimer] Error 1

Я дважды проверил это местоположение, и библиотека определенно находится по адресу: /usr/local/boost/boost_1_39_0/stage/lib/libboost_filesystem-gcc41-mt.a

Пока не радуйтесь, используйте это сейчас:

accesstimer: acctime.o bentimer.o
    g++  -L/usr/local/boost/boost_1_39_0 -lboost_filesystem-gcc41-mt acctime.o bentimer.o -o accesstimer    

acctime.o: acctime.cpp bentimer.h
    g++ -I /usr/local/boost/boost_1_39_0 -c acctime.cpp 

bentimer.o: bentimer.cpp bentimer.h
    g++ -c bentimer.cpp 

Начало:

g++  -L/usr/local/boost/boost_1_39_0/stage/lib/ -llibboost_filesystem-gcc41-mt acctime.o bentimer.o -o accesstimer
/usr/bin/ld: cannot find -llibboost_filesystem-gcc41-mt
collect2: ld returned 1 exit status
make: *** [accesstimer] Error 1

Это работает с этим:

accesstimer: acctime.o bentimer.o
    g++ -L/usr/local/boost/boost_1_39_0/stage/lib -lboost_filesystem acctime.o bentimer.o -o accesstimer    

acctime.o: acctime.cpp bentimer.h
    g++ -I /usr/local/boost/boost_1_39_0 -c acctime.cpp 

bentimer.o: bentimer.cpp bentimer.h
    g++ -c bentimer.cpp 

Спасибо за вашу помощь

Ответы [ 3 ]

9 голосов
/ 20 августа 2009

EDITED
Когда вы связываете объектные файлы для создания исполняемого файла (ваше первое правило make-файла), вы должны передать расположение библиотек boost с флагом -L и имена библиотек с флагом -l .

accesstimer: acctime.o bentimer.o
    g++ -L/usr/local/boost/boost_1_39_0/stage/lib -lboost_filesystem acctime.o bentimer.o -o accesstimer

где /usr/local/boost/boost_1_39_0/stage/lib - это каталог, содержащий библиотеки, а boost_filesystem - имя файла библиотеки без начала lib (при необходимости измените эти два).

ДРУГОЕ РЕДАКТИРОВАНИЕ Файл .a, который вы пытаетесь связать, неправильный ... библиотека не должна иметь расширения.

2 голосов
/ 20 августа 2009

Вам необходимо добавить библиотеки наддува к фазе компоновки (целевой линии accesstimer), а не к фазе компиляции (где требуется только путь включения).

0 голосов
/ 22 декабря 2017

Привет. Ниже приведена полная процедура добавления буста в файл cmake / make. Этот ответ специально разработан для начинающего программиста в cpp.

Если вы хотите добавить поддержку библиотеки повышения с помощью Makefile, вам нужно указать путь к библиотеке (с опцией -L) и библиотеки (с опцией -l).

-L путь / к / библиотекам -1 Библиотека

** Теперь как найти путь к библиотекам **

Вот трюк:

  1. Открыть терминал и запустить команду

    $ locate boost> libboost.txt

    $ gedit libboost.txt

  2. Эта команда открывает текстовый файл, содержащий все пути к библиотекам буста.

  3. Теперь найдите ("ctr + F") libboost , который выделяет библиотечные файлы boost с расширением .a и .so в этом текстовом файле.

  4. Скопируйте путь, по которому присутствуют эти .so файлы.

    Например: если файл .so присутствует как / usr / lib / x86_64-linux-gnu / libboost_filesystem.so

    затем укажите путь как: -L / usr / lib / x86_64-linux-gnu /

Теперь, как найти соответствующую библиотеку?

  1. Это зависит от того, какие буст-функции / модули вы используете

    например: Если вы используете потоковое ускорение, вам потребуются следующие библиотеки

    libboost_filesystem.so

    libboost_thread.so

    libboost_system.so

  2. Добавьте указанные выше библиотеки следующим образом с опцией -l:

    -l lboost_filesystem

    -l lboost_thread

    -l lboost_system

Надеюсь, это поможет вам, в дальнейшем. Если есть более простой способ, пожалуйста, предложите

...