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

Вы можете просто поместить все строки вашего CSV-файла в список через readlines(), а затем удалить нужную строку. Например:

f = open("mycsvfile.csv")
l = f.readlines()

for i in l:
    ...  # do some operation

    del l[i]  # delete the line
18
задан AstroCB 11 February 2015 в 04:33
поделиться

3 ответа

Есть метод грубой силы, который я иногда использую, но вы должны знать, в каких каталогах искать нужную вам библиотеку (обычно подозреваются /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.

9
ответ дан 30 November 2019 в 09:14
поделиться

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

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

--------

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


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

4
ответ дан 30 November 2019 в 09:14
поделиться
  • Одна из возможностей - проверить список файлов пакета rpm / deb. В системе Ubuntu это можно сделать с помощью следующей команды:

dpkg -L libboost-filesystem-dev

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

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

1
ответ дан 30 November 2019 в 09:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: