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;
}
我试图编译它,但作为一个新手,我犯了一个新手错误:我忘了链接到正确的库!
Run Code Online (Sandbox Code Playgroud) g++ boost_example.cpp -o run
确切地说,我遇到了本书这一章中解释的问题.
我知道我已经安装了升级版(我被告知安装它来编译另一个项目).我试图从其他项目的Makefile中复制,但以下不起作用:
g++ boost_example.cpp -o run -lbooster
尝试从代码中的#include行做出有根据的猜测,我尝试了以下无效:
g++ boost_example.cpp -o run -lboost
到那时,我已经开始了疯狂地搜索网页.我讨厌搜索引擎,因为大多数时候,你找不到你正在寻找的东西.我找到了以下内容,但他们没有帮助,只是浪费我的时间: 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但是我没有找到任何编译信息.
在某个阶段,我受到启发,检查我在系统上实际安装的内容:
Run Code Online (Sandbox Code Playgroud)
因此,我找到了要链接的库的正确名称.以下工作:
$ 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 /上查看了我在系统上可以找到的内容:
Run Code Online (Sandbox Code Playgroud)
$ 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
现在我非常努力,因为我真的不知道如何将上面的内容与boost库列表相关联.
我为这个冗长的例子道歉,但它完美地说明了我的问题:
除了猜测,搜索网络,询问其他人,试验和错误等...是否有更智能的方法来找到应链接到的图书馆的名称?是不是应该在某处记录那些东西?
就增强而言,我当然有兴趣知道答案,但我的问题更通用,适用于任何图书馆.
顺便说一句,我有一个关于linux软件包名称的非常相似的问题(无论是.deb还是.rpm).如果我被告知要编译我需要的这样或那样的软件,比如PRCE或FooBar,我怎么知道要安装的软件包的名称呢?我知道如何使用apt-cache(对于Kubuntu debs)但是一些软件包命名不直观,我经常最终安装我不需要的软件包...
我有时会使用一种暴力方法,但是您必须知道要查找所需库的目录(/ 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.
我刚刚找到了(在我的系统上)最智能和最官方的方式来找出链接标志。以下内容仅适用于 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 静态共享
只需找到文档的正确位置即可!