是否有一种智能方法可以在编译时知道要链接到的库的名称?(Linux的/ Kubuntu的)

aug*_*tin 18 c++ compilation linked-list libraries

请多多包涵.我真的想知道,因为我对答案感到好奇:

是否有一种智能方法可以在编译时知道要链接到的库的名称?

请允许我举一个例子,说明我的问题的原因.

我是C++新手.我正在学习编译,链接和像boost这样的库.我刚刚发现了boost/filesystem并想尝试一下.遇到麻烦编译后,我使用了以下极简主义代码:


// file boost_example.cpp
 #include "boost/filesystem.hpp"
#include <iostream>

int main() { std::cout<<"Hello"; return 0; }

我试图编译它,但作为一个新手,我犯了一个新手错误:我忘了链接到正确的库!

     g++ boost_example.cpp -o run
Run Code Online (Sandbox Code Playgroud)
确切地说,我遇到了本书这一章中解释的问题.
我知道我已经安装了升级版(我被告知安装它来编译另一个项目).我试图从其他项目的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
Run Code Online (Sandbox Code Playgroud) 因此,我找到了要链接的库的正确名称.以下工作:
     g++ boost_example.cpp -o run -lboost_filesystem-mt

现在,除了使用(可能)智能猜测工作和搜索网络之外,是否有更智能的方法来查找要链接的库的名称?我永远不会猜到boost_filesystem-mt给出标题的库名"boost/filesystem.hpp".

更糟糕的是:官方网站上没有提到boost_filesystem-mt!(我猜这是依赖于发行/包装).

再一次,在提出问题之前,我总是提出RTFM,我找到了上述书中的这一章,所以我在/ usr/lib /上查看了我在系统上可以找到的内容:

$ ls /usr/lib/boost
/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
Run Code Online (Sandbox Code Playgroud)

现在我非常努力,因为我真的不知道如何将上面的内容与boost库列表相关联.

我为这个冗长的例子道歉,但它完美地说明了我的问题:

除了猜测,搜索网络,询问其他人,试验和错误等...是否有更智能的方法来找到应链接到的图书馆的名称?是不是应该在某处记录那些东西?

就增强而言,我当然有兴趣知道答案,但我的问题更通用,适用于任何图书馆.

顺便说一句,我有一个关于linux软件包名称的非常​​相似的问题(无论是.deb还是.rpm).如果我被告知要编译我需要的这样或那样的软件,比如PRCE或FooBar,我怎么知道要安装的软件包的名称呢?我知道如何使用apt-cache(对于Kubuntu debs)但是一些软件包命名不直观,我经常最终安装我不需要的软件包...

Dav*_*lin 9

我有时会使用一种暴力方法,但是您必须知道要查找所需库的目录(/ lib,/ usr/lib和/ usr/local/lib是常见的嫌疑人).我创建了一个shell脚本,我称之为"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
Run Code Online (Sandbox Code Playgroud)

当我在搜索定义特定符号的库时,我会发出如下命令:

gnm symbol /usr/lib/*.a 
Run Code Online (Sandbox Code Playgroud)

例如,您提到的来源给我以下链接错误:

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()'
Run Code Online (Sandbox Code Playgroud)

所以我使用命令:

gnm get_system_category /usr/lib/*.a
Run Code Online (Sandbox Code Playgroud)

报道:

/usr/lib/libboost_filesystem.a
/usr/lib/libboost_system.a
Run Code Online (Sandbox Code Playgroud)

尝试第一个导致相同的错误,但第二个工作:

g++ boost_example.cpp -lboost_system -o run
Run Code Online (Sandbox Code Playgroud)

我不知道为什么我需要你需要文件系统的系统库; 也许不同版本的Boost.


aug*_*tin 5

我刚刚找到了(在我的系统上)最智能和最官方的方式来找出链接标志。以下内容仅适用于 Debian 或 Debian 衍生发行版(如我的例子中的 Kubuntu)上的 boost。对于任何系统上的任何库,其他答复可能更通用。

根据安装的 boost 版本,您的类似 Debian 的发行版上可能有以下文件:
/usr/share/doc/libboost1.38-doc/README.Debian
其中部分内容如下:

--------

下表显示了哪些组件使用库(共享或
static)和相应的“-l”标志。请注意,只有
库的多线程版本已发布。

  组件链接标志库类型
  --------- --------- ------------
  Boost.Date_Time -lboost_date_time-mt 静态共享
  Boost.Filesystem -lboost_filesystem-mt 静态共享
  Boost.Graph -lboost_graph-mt 静态共享
  Boost.IOStreams -lboost_iostreams-mt 静态共享
  Boost.Math -lboost_math_c99-mt 静态共享
                         -lboost_math_c99f-mt 静态共享
                         -lboost_math_c99l-mt 静态共享
  Boost.MPI -lboost_mpi-mt 静态共享
  Boost.Program_options -lboost_program_options -mt 静态共享
  Boost.Python -lboost_python-mt-py24 静态共享
                         -lboost_python-mt-py25 静态共享
  Boost.Regex -lboost_regex-mt 静态共享
  Boost.Serialization -lboost_serialization-mt 静态共享
                         -lboost_wserialization-mt 静态共享
  Boost.Signals -lboost_signals-mt 静态共享
  Boost.System -lboost_system-mt 静态共享
  Boost.Test -lboost_prg_exec_monitor-mt 静态共享
                         -lboost_unit_test_framework-mt 静态共享
  Boost.Thread -lboost_thread-mt 静态共享
  Boost.Wave -lboost_wave-mt 静态共享


只需找到文档的正确位置即可!