如何知道需要链接哪些外部库文件或位置

问题描述 投票:0回答:1

我是 Linux 上的 C++ 开发新手,所以我想知道:

一般来说,如何准确地找出外部库需要链接哪些文件/位置?

我正在尝试将一个库链接到我安装的 C++ 项目,如下所示:

sudo apt-get install libvlc-dev

如果我运行

make
,它会给我一堆
undefined reference
错误,因为库尚未链接。我读到我需要从 /usr/lib/ 中的某个位置链接它。

为了找到我需要链接的文件,我做了

apt-file list libvlc-dev
,它返回:

libvlc-dev: /usr/include/vlc/deprecated.h 
libvlc-dev: /usr/include/vlc/libvlc.h
libvlc-dev: /usr/include/vlc/libvlc_dialog.h
libvlc-dev: /usr/include/vlc/libvlc_events.h
libvlc-dev: /usr/include/vlc/libvlc_media.h
libvlc-dev: /usr/include/vlc/libvlc_media_discoverer.h
libvlc-dev: /usr/include/vlc/libvlc_media_library.h
libvlc-dev: /usr/include/vlc/libvlc_media_list.h
libvlc-dev: /usr/include/vlc/libvlc_media_list_player.h
libvlc-dev: /usr/include/vlc/libvlc_media_player.h
libvlc-dev: /usr/include/vlc/libvlc_renderer_discoverer.h
libvlc-dev: /usr/include/vlc/libvlc_version.h
libvlc-dev: /usr/include/vlc/libvlc_vlm.h
libvlc-dev: /usr/include/vlc/vlc.h
libvlc-dev: /usr/lib/aarch64-linux-gnu/libvlc.so
libvlc-dev: /usr/lib/aarch64-linux-gnu/pkgconfig/libvlc.pc
libvlc-dev: /usr/share/bug/libvlc-dev/control
libvlc-dev: /usr/share/bug/libvlc-dev/presubj
libvlc-dev: /usr/share/doc/libvlc-dev/changelog.Debian.gz
libvlc-dev: /usr/share/doc/libvlc-dev/changelog.gz
libvlc-dev: /usr/share/doc/libvlc-dev/copyright
libvlc-dev: /usr/share/doc/libvlc-dev/examples/QtPlayer/LICENSE
libvlc-dev: /usr/share/doc/libvlc-dev/examples/QtPlayer/QtVLC.pro
libvlc-dev: /usr/share/doc/libvlc-dev/examples/QtPlayer/main.cpp
libvlc-dev: /usr/share/doc/libvlc-dev/examples/QtPlayer/player.cpp
libvlc-dev: /usr/share/doc/libvlc-dev/examples/QtPlayer/player.h
libvlc-dev: /usr/share/doc/libvlc-dev/examples/gtk_player.c
libvlc-dev: /usr/share/doc/libvlc-dev/examples/libvlc_DVD_ripper.c
libvlc-dev: /usr/share/doc/libvlc-dev/examples/vlc-thumb.c
libvlc-dev: /usr/share/doc/libvlc-dev/examples/wx_player.cpp

看来我需要链接其中一个?

libvlc-dev: /usr/lib/aarch64-linux-gnu/libvlc.so
libvlc-dev: /usr/lib/aarch64-linux-gnu/pkgconfig/libvlc.pc

因此基于this makefile 语法:

LDFLAGS= -L<Directory where the library resides> -l<library name>

我会做:

LDFLAGS= -L/usr/lib/aarch64-linux-gnu/ -llibvlc

这是正确的吗?

c++ linux gcc makefile
1个回答
0
投票

通常如何准确地找出外部库需要链接哪些文件/位置?

人们通常依赖于库的文档来命名它。如果这还不够,那么您可以查找

lib*.so
文件(目前通常如此)或
lib*.a
文件。库名称是
lib
.so
/
.a
之间的部分。

通常,您不需要知道具体位置。链接器有一个库搜索路径,它将用来尝试查找您所需的库。在传统组织的系统上,大多数库将安装到搜索路径上的目录中,因此您只需告诉链接器就是

-l<name>
(见上文)。例如,
-lvlc

如果链接器的搜索路径中恰好没有安装库,请参阅上面关于识别库文件的内容。您需要通过

-L
选项将安装目录添加到链接器的搜索路径中。例如,
-L/usr/lib/aarch64-linux-gnu

我会做:

LDFLAGS= -L/usr/lib/aarch64-linux-gnu/ -llibvlc

这取决于如何使用

LDFLAGS
,但如果它在你的makefile或你的工具中使用,但如果它以传统方式使用,那么不,你不会

许多链接器对其命令行参数的顺序很敏感。

-L
参数应出现在需要影响其查找的任何库之前。应在目标文件和解析任何符号的其他库之后请求库。

LDFLAGS
(通常)不适合指定要链接的库的标志。按照惯例,它是在要链接的对象之前扩展的,因此为时过早。它用于链接标志除了库之外。如果您依赖 GNU
make
的内置规则,那么您可以将库放入
LDLIBS
中。如果您使用的是项目特定的构建规则,或者不同的
make
,或者诸如此类的东西,那么您必须弄清楚适当的变量是什么,或者是否对某些内容进行硬编码,或者项目可能附带了预编译规则。您应该使用构建配置实用程序。

© www.soinside.com 2019 - 2024. All rights reserved.