Пожалуйста, потерпите меня.Я действительно хочу знать, поскольку мне любопытно узнать ответ:
Существует ли разумный способ узнать имя библиотеки, на которую можно ссылаться во время компиляции?
Позвольте мне дать вамПример, который прекрасно иллюстрирует причину моего вопроса.
Я новичок в C ++.Я изучаю компиляцию, компоновку и библиотеки, такие как boost.Я только что обнаружил boost / filesystem и хотел попробовать.После проблем с компиляцией я использовал следующий минималистский код:
<code>
// file boost_example.cpp
#include "boost/filesystem.hpp"<br>
#include <iostream></p>
<p>int main()
{
std::cout<<"Hello";
return 0;
}
Я пытался скомпилировать его, но, будучи новичком, я сделал ошибку новичка: я забылссылка на нужную библиотеку!
g++ boost_example.cpp -o run
Если быть точным, я столкнулся с проблемой, описанной в этой главе этой прекрасной книги .
Я знал, что у меня установлен надстройка (я былсказал установить его для компиляции другого проекта).Я попытался скопировать из Makefile этого другого проекта, но следующее не сработало:
g++ boost_example.cpp -o run -lbooster
g++ boost_example.cpp -o run -lboost
Пытаясь сделать обоснованное предположение из строки #include в коде, я попробовал следующее, чтобы нетолку: g++ boost_example.cpp -o run -lboost_filesystem
К тому времени я начал лихорадочно искать в Интернете.Я ненавижу поисковые системы, потому что большую часть времени вы не можете найти то, что ищете.Я обнаружил следующее, но они не помогли, но потратили впустую мое время:
Проблема повышения ссылки на библиотеку в kubuntu
Ошибки компоновщика C ++ / Boost
Поскольку я парень из RTFM, я на самом деле проверил официальную документацию по библиотеке, которую хотел использовать: http://www.boost.org/doc/libs/1_43_0/libs/filesystem/doc/index.htm, но не нашел никакой информации по компиляции.
На каком-то этапе меня вдохновило проверить, что я на самом деле установил в своей системе:
$ locate boost_file
/usr/lib/libboost_filesystem-mt.a
/usr/lib/libboost_filesystem-mt.so
/usr/lib/libboost_filesystem-mt.so.1.38.0
Таким образом, я нашел правильное имя библиотеки для ссылки.Сработало следующее:
g++ boost_example.cpp -o run -lboost_filesystem-mt
Теперь, кроме использования (возможно) интеллектуальных догадок и поиска в Интернете, существует ли более разумный способ найти имя библиотеки, на которую можно ссылаться?Я бы никогда не угадал имя библиотеки boost_filesystem-mt
, учитывая заголовок "boost/filesystem.hpp"
.
Что еще хуже: boost_filesystem-mt нигде не упоминается на официальном сайте!(Я предполагаю, что это зависит от дистрибутива / упаковки).
Опять же, я всегда обращаю внимание на RTFM, прежде чем задавать вопрос, и я нашел эту главу вышеупомянутой книги , поэтому япроверил, что я могу найти в моей системе по адресу / usr / lib /:
$ ls /usr/lib/<em>boost</em>
/usr/lib/libboost_date_time-mt.a /usr/lib/libboost_prg_exec_monitor-mt.so.1.38.0
/usr/lib/libboost_date_time-mt.so /usr/lib/libboost_program_options-mt.a
/usr/lib/libboost_date_time-mt.so.1.38.0 /usr/lib/libboost_program_options-mt.so
/usr/lib/libbooster.a /usr/lib/libboost_program_options-mt.so.1.38.0
/usr/lib/libbooster.so /usr/lib/libboost_python-mt.a
/usr/lib/libbooster.so.0 /usr/lib/libboost_python-mt-py25.a
/usr/lib/libbooster.so.0.0.0 /usr/lib/libboost_python-mt-py25.so
/usr/lib/libboost_filesystem-mt.a /usr/lib/libboost_python-mt-py25.so.1.38.0
/usr/lib/libboost_filesystem-mt.so /usr/lib/libboost_python-mt-py26.a
/usr/lib/libboost_filesystem-mt.so.1.38.0 /usr/lib/libboost_python-mt-py26.so
/usr/lib/libboost_graph-mt.a /usr/lib/libboost_python-mt-py26.so.1.38.0
/usr/lib/libboost_graph-mt.so /usr/lib/libboost_python-mt.so
/usr/lib/libboost_graph-mt.so.1.38.0 /usr/lib/libboost_regex-mt.a
/usr/lib/libboost_iostreams-mt.a /usr/lib/libboost_regex-mt.so
/usr/lib/libboost_iostreams-mt.so /usr/lib/libboost_regex-mt.so.1.38.0
/usr/lib/libboost_iostreams-mt.so.1.38.0 /usr/lib/libboost_serialization-mt.a
/usr/lib/libboost_math_c99f-mt.a /usr/lib/libboost_serialization-mt.so
/usr/lib/libboost_math_c99f-mt.so /usr/lib/libboost_serialization-mt.so.1.38.0
/usr/lib/libboost_math_c99f-mt.so.1.38.0 /usr/lib/libboost_signals-mt.a
/usr/lib/libboost_math_c99l-mt.a /usr/lib/libboost_signals-mt.so
/usr/lib/libboost_math_c99l-mt.so /usr/lib/libboost_signals-mt.so.1.38.0
/usr/lib/libboost_math_c99l-mt.so.1.38.0 /usr/lib/libboost_system-mt.a
/usr/lib/libboost_math_c99-mt.a /usr/lib/libboost_system-mt.so
/usr/lib/libboost_math_c99-mt.so /usr/lib/libboost_system-mt.so.1.38.0
/usr/lib/libboost_math_c99-mt.so.1.38.0 /usr/lib/libboost_thread-mt.a
/usr/lib/libboost_math_tr1f-mt.a /usr/lib/libboost_thread-mt.so
/usr/lib/libboost_math_tr1f-mt.so /usr/lib/libboost_thread-mt.so.1.38.0
/usr/lib/libboost_math_tr1f-mt.so.1.38.0 /usr/lib/libboost_unit_test_framework-mt.a
/usr/lib/libboost_math_tr1l-mt.a /usr/lib/libboost_unit_test_framework-mt.so
/usr/lib/libboost_math_tr1l-mt.so /usr/lib/libboost_unit_test_framework-mt.so.1.38.0
/usr/lib/libboost_math_tr1l-mt.so.1.38.0 /usr/lib/libboost_wave-mt.a
/usr/lib/libboost_math_tr1-mt.a /usr/lib/libboost_wave-mt.so
/usr/lib/libboost_math_tr1-mt.so /usr/lib/libboost_wave-mt.so.1.38.0
/usr/lib/libboost_math_tr1-mt.so.1.38.0 /usr/lib/libboost_wserialization-mt.a
/usr/lib/libboost_prg_exec_monitor-mt.a /usr/lib/libboost_wserialization-mt.so
/usr/lib/libboost_prg_exec_monitor-mt.so /usr/lib/libboost_wserialization-mt.so.1.38.0
И теперь я очень сильно чищу голову, потому что я действительно не знаю, как соотнести это с список расширенных библиотек .
Я прошу прощения за этот скучный пример, но он отлично иллюстрирует мою проблему:
Помимо догадок, поиска в Интернете,спрашивать других людей, методом проб и ошибок и т. д. ... есть ли более разумный способ найти название библиотеки, на которую нужно сослаться? Разве такие вещи не должны документироваться где-нибудь?
Мне, конечно, интересно узнать ответ в отношении boost, но мой вопрос носит более общий характер и применим к любой библиотеке.
Кстати, у меня очень похожий вопрос относительно имени linпакеты ux (будь то .deb или .rpm).Если мне сказали, что для компиляции того или иного программного обеспечения мне понадобится, скажем, PRCE или FooBar, как мне точно узнать имя устанавливаемого пакета?Я знаю, как использовать apt-cache (для Kubuntu debs), но некоторые имена пакетов не интуитивны, и я часто заканчиваю тем, что устанавливаю пакеты, которые мне не нужны ...