Есть ли интеллектуальный способ узнать имя библиотеки, на которую можно ссылаться во время компиляции?(Linux / Kubuntu) - PullRequest
17 голосов
/ 12 августа 2010

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

Существует ли разумный способ узнать имя библиотеки, на которую можно ссылаться во время компиляции?

Позвольте мне дать вамПример, который прекрасно иллюстрирует причину моего вопроса.

Я новичок в 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), но некоторые имена пакетов не интуитивны, и я часто заканчиваю тем, что устанавливаю пакеты, которые мне не нужны ...

Ответы [ 4 ]

8 голосов
/ 24 августа 2010

Есть метод грубой силы, который я иногда использую, но вы должны знать, какие каталоги искать нужную вам библиотеку (обычные подозреваемые / lib, / usr / lib и / usr / local / lib) , Я создал сценарий оболочки, который я называю «gnm» (сокращение от «grep nm», две утилиты, которые он использует) с приведенным ниже содержимым. Если вы создаете такой текстовый файл, не забудьте сделать его исполняемым (chmod + x gnm).

#!/bin/sh
if [ $# -lt 2 ] ; then
  echo Usage: $0 pattern file[s]
  exit
fi
pattern=$1
shift
while [ $# -gt 0 ] ; do
  nm $1 | grep $pattern > /dev/null
  if [ $? -eq 0 ] ; then
    echo $1
  fi
  shift
done

Когда я ищу библиотеку, которая определяет определенный символ, я выдаю команду что-то вроде:

gnm symbol /usr/lib/*.a 

Например, упомянутый вами источник дает мне следующие ошибки ссылки:

boost_example.cpp:(.text+0x38): undefined reference to `boost::system::get_system_category()'
boost_example.cpp:(.text+0x44): undefined reference to `boost::system::get_generic_category()'
boost_example.cpp:(.text+0x50): undefined reference to `boost::system::get_generic_category()'
boost_example.cpp:(.text+0x5c): undefined reference to `boost::system::get_generic_category()'
boost_example.cpp:(.text+0x68): undefined reference to `boost::system::get_system_category()'

поэтому я использую команду:

gnm get_system_category /usr/lib/*.a

который сообщает:

/usr/lib/libboost_filesystem.a
/usr/lib/libboost_system.a

Попытка первого из этих результатов приводит к тем же ошибкам, но второй работает:

g++ boost_example.cpp -lboost_system -o run

Не знаю, зачем мне нужна системная библиотека, где вам нужна файловая система; возможно разные версии Boost.

3 голосов
/ 25 августа 2010

Я только что нашел самый интеллектуальный и самый официальный способ (в моей системе) выяснить флаг ссылки.Следующее действительно только для наддува в дистрибутиве Debian или производном Debian (как Kubuntu в моем случае).Другие ответы могут быть более общими для любой библиотеки в любой системе.

В зависимости от установленной расширенной версии в вашем Debian-подобном дистрибутиве может быть следующий файл:
/usr/share/doc/libboost1.38-doc/README.Debian
partиз которых гласит:

--------

The following table shows which components use a library (shared or
static) and the corresponding "-l" flag.  Note that only the
multithreaded version of the libraries is shipped.

  Component              Link Flag                    Library Type
  ---------              ---------                    ------------
  Boost.Date_Time        -lboost_date_time-mt           static  shared
  Boost.Filesystem       -lboost_filesystem-mt          static  shared
  Boost.Graph            -lboost_graph-mt               static  shared
  Boost.IOStreams        -lboost_iostreams-mt           static  shared
  Boost.Math             -lboost_math_c99-mt            static  shared
                         -lboost_math_c99f-mt           static  shared
                         -lboost_math_c99l-mt           static  shared
  Boost.MPI              -lboost_mpi-mt                 static  shared
  Boost.Program_options  -lboost_program_options-mt     static  shared
  Boost.Python           -lboost_python-mt-py24         static  shared
                         -lboost_python-mt-py25         static  shared
  Boost.Regex            -lboost_regex-mt               static  shared
  Boost.Serialization    -lboost_serialization-mt       static  shared
                         -lboost_wserialization-mt      static  shared
  Boost.Signals          -lboost_signals-mt             static  shared
  Boost.System           -lboost_system-mt              static  shared
  Boost.Test             -lboost_prg_exec_monitor-mt    static  shared
                         -lboost_unit_test_framework-mt static  shared
  Boost.Thread           -lboost_thread-mt              static  shared
  Boost.Wave             -lboost_wave-mt                static  shared


Нужно было только найти подходящее место для документации!

2 голосов
/ 28 июня 2013

http://www.boost.org/doc/libs/1_53_0/doc/html/bbv2/installation.html Читайте об установке там, все очень понятно.

1 голос
/ 12 августа 2010
  • Одна из возможностей - проверить список файлов пакета rpm / deb.В системе Ubuntu это можно сделать, введя следующую команду:

dpkg -L libboost-filesystem-dev

  • ДругойВозможность использования pkg-config.Это программа, которая помогает определить флаги компиляции для определенных библиотек (даже если она не поддерживает повышение в Ubuntu)

  • Вы можете использовать Autoconf - макрос, который проверяет повышение, можно найти здесь .Использование Autoconf помогает сохранить независимость платформы / дистрибутива ваших источников.

...