Включение библиотек повышения в make-файлы

Я изучаю 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, этот файл m,ake работает нормально. Как только я добавляю элементы файловой системы 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

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 
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 

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


person Community    schedule 20.08.2009    source источник
comment
Не могли бы вы опубликовать сообщение об ошибке, которое вы получаете?   -  person Paolo Tedesco    schedule 20.08.2009
comment
Когда вы связываете библиотеки с флагом -l, вы всегда пропускаете ведущую библиотеку. Таким образом, связывание libm.a — это -lm, libboost — это -lboost и т. д.   -  person Zan Lynx    schedule 20.08.2009


Ответы (3)


ОТРЕДАКТИРОВАНО
Когда вы связываете объектные файлы для создания исполняемого файла (ваше первое правило makefile), вы должны передать расположение библиотек повышения с помощью флага -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, который вы пытаетесь связать, неправильный... у библиотеки не должно быть расширения.

person Paolo Tedesco    schedule 20.08.2009

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

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

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

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

Следующий трюк:

  1. #P6# <блочная цитата> #P7# #P8#
  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

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

person Community    schedule 22.12.2017

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

person haggai_e    schedule 20.08.2009