当包含gcc的库(-l或小写-L)时,我如何知道要放入特定头文件的参数的库名?
一个例子(但我正在寻找更一般的答案):
我的c文件(名为doSomething.c)可能包含:
#include <libv4l2.h>
...
...
我的gcc声明如下:
gcc -o doSomething doSomething.c -lv4l2
在这种情况下,我知道我需要包含库v4l2,如果我还不知道是否有找到该名称的通用方法?
任何帮助将不胜感激
感谢
答案 0 :(得分:0)
POSIX环境(如Linux)中链接器库的名称具有特殊格式。
静态库(基本上是目标文件的存档)的格式为libname.a
。
动态库的格式为libname.so
。可能在末尾附加了一些版本号(例如libname.so.1
或libname.so.1.3
)。
使用-l
(小写L)标记进行链接时,您只需指定name
。
另请详细了解添加要链接的库的-l
与添加路径以查找库的-L
之间的区别。
答案 1 :(得分:0)
无论谁向你提供图书馆都应该告诉你它的名字。通常,这是模糊的,暗示的,埋藏在文档中,或留给惯例。
首先,您可以使用文件系统中的完整路径将任何库传递给链接器,例如/usr/lib/libfoo.so或~myaccount / mystuff / bar.a。
链接器有一个内置的标准位置列表来查找库,因此您可以不使用路径的目录部分,只需命名文件,例如libfoo.so。您还可以使用-L开关将目录添加到此列表中(对于POSIX和其他系统上的公共链接器)。
如果文件名的格式为lib foo .a或链接器识别的其他扩展名,则可以使用-l foo 缩写。
因此,如果库安装在标准名称的标准位置,您可以将其链接到-l foo ,供应商或其他供应商应该告诉您 foo < / em>是。
如果库是系统上安装但不是系统标准部分的软件包的一部分,您可以询问系统管理员名称是什么,如果它不在标准位置,在哪里安装它。
答案 2 :(得分:0)
在POSIX系统上,库文件被命名为libxxx.a
(对于将被集成到您的可执行文件中的静态库)或libxxx.so
(对于将在以下链接的动态库;运行时ld.so
(ld-linux.so
用于GNU / Linux))。两者都可以选择带有版本后缀,例如libc.so.6
。您与软件包管理器(apt
,yum
或pacman
)一起安装的标准库和其他库位于/lib
和/usr/lib
。
链接时,您只需要指定其名称(即xxx
)。就像你想链接数学库libm.so
一样,用
gcc needMath.c -o needMath -lm
~~^
在其他平台上,您最好查看库提供程序的手册,以确定要作为编译器的命令行参数提供的实际名称。手册是你的朋友。