如何使library.a文件与gcc/g++;
当我想编译一些使用libspotify的东西时,例如,我可以通过在compilation命令中包含术语如何使library.a文件与gcc/g++;,gcc,installation,linker,posix,static-libraries,Gcc,Installation,Linker,Posix,Static Libraries,当我想编译一些使用libspotify的东西时,例如,我可以通过在compilation命令中包含术语-lspotify来链接libspotify库,然后一切都可以正常工作 如果我正在编写和安装我自己的库,我应该将.a文件放在哪里(或者在任何情况下我应该做什么),以便能够以相同的方式链接到我的库 如果有问题,这个问题涉及Posix系统。目前我对如何在Windows中实现这一点不感兴趣。只要链接器(ld)知道在哪里查找,就可以将库放在任何地方 为了它 链接器如何知道在哪里查找库 您可以通过命令行选
-lspotify
来链接libspotify库,然后一切都可以正常工作
如果我正在编写和安装我自己的库,我应该将.a文件放在哪里(或者在任何情况下我应该做什么),以便能够以相同的方式链接到我的库
如果有问题,这个问题涉及Posix系统。目前我对如何在Windows中实现这一点不感兴趣。只要链接器(
ld
)知道在哪里查找,就可以将库放在任何地方
为了它
链接器如何知道在哪里查找库
您可以通过命令行选项的一个或多个实例来告诉它要查看的位置
-L
如果你链接到选项
-L/look/here/first -L/look/here/second -lfoo
然后使用查找库的ld
,libfoo.so
(共享)或libfoo.a
(静态),在
/look/here/first
;在/look/here/second
中失败;如果不行的话
它将查看已配置的默认位置列表,并检查其中任何一个
它会失败,抱怨找不到-lfoo
。虽然
-L
选项很重要,-L
选项相对于`-L选项的顺序
没关系:
-lfoo -L/look/here/first -L/look/here/second
意思是一样的
一旦找到libfoo
某个地方,链接器就不会再进一步查看,而是在每个目录中
默认情况下,它在查找libfoo.a
之前先查找libfoo.so
通常我们不会直接调用ld
进行链接。我们通过调用一个链接
在特定语言的工具驱动程序中,gcc
,g++
,gfortran
等,通过
它提供了一些选项,这些选项指示它进行链接,而不是预处理或编译。
在这种情况下,工具驱动程序代表我们在幕后调用ld
附加对该语言不变的其他链接器选项
问题是,我们不必记住和重复命令行中的样板文件
但是,ld
本身为每个架构都有一个内置的默认-L
目录列表
它所支持的。这些都是由创建您的ld
的人配置的,通常是您的发行版,
在这种情况下,您会发现默认位置是库所在的目录
通常由发行版的软件包管理器安装
因此,如果要链接位于默认位置之一的库,则不需要链接
需要自己指定任何-L
选项<代码>-lfoo就可以了
相反,如果您希望能够简单地链接libfoo.a
通过在链接命令行中提到-lfoo
,您需要将其放入
链接器的默认位置之一。如果您想以这种方式分发libfoo.a
其他用户可以以相同的方式链接它,然后您需要分发
它将安装在一个包中,该包将安装在一个默认位置(目标计算机上)
系统,不管它是什么)
为此,您需要知道默认位置是什么。对于Posix系统,
您可以依赖于/usr/local/lib
、/lib
和/usr/lib
。但不要安装在/lib
中。
这是为重要的系统库保留的。查看链接器的默认搜索
目录实际上位于您自己的系统上,您可以运行:
gcc -m64 -Xlinker --verbose 2>/dev/null | grep SEARCH_DIR
它会发出类似于:
SEARCH_DIR("=/usr/local/lib/x86_64-linux-gnu"); \
SEARCH_DIR("=/lib/x86_64-linux-gnu"); \
SEARCH_DIR("=/usr/lib/x86_64-linux-gnu"); \
SEARCH_DIR("=/usr/local/lib64"); \
SEARCH_DIR("=/lib64"); \
SEARCH_DIR("=/usr/lib64"); \
SEARCH_DIR("=/usr/local/lib"); \
SEARCH_DIR("=/lib"); \
SEARCH_DIR("=/usr/lib"); \
SEARCH_DIR("=/usr/x86_64-linux-gnu/lib64"); \
SEARCH_DIR("=/usr/x86_64-linux-gnu/lib");
#include "..." search starts here:
#include <...> search starts here:
/usr/lib/gcc/x86_64-linux-gnu/5/include
/usr/local/include
/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed
/usr/include/x86_64-linux-gnu
/usr/include
告诉您这些目录是默认的-L
-options,按该顺序排列。
请注意,您必须选择您需要的64/32位风格的链接
我们关心的是。用-m32
替换-m64
,您会得到一些东西
不一样。可移植Posix选项(不包括/lib
)是/usr/local/lib
和/usr/lib
这回答了你的问题,但你还没说完。大概是你的图书馆
附带一个或多个头文件,程序可以通过这些头文件导入其API。
如果库将位于链接器的默认搜索路径中,则标头
最好是在编译器的默认搜索路径中,这样程序就可以
只需#包含
,或者可能#包含
并拥有编译器
无需在编译器命令行中编写-I/foo/headers/are/here
即可找到标题
要查看编译器的默认搜索路径,对于C,请运行:
echo | gcc -xc -E -v -
输出的相关位类似于:
SEARCH_DIR("=/usr/local/lib/x86_64-linux-gnu"); \
SEARCH_DIR("=/lib/x86_64-linux-gnu"); \
SEARCH_DIR("=/usr/lib/x86_64-linux-gnu"); \
SEARCH_DIR("=/usr/local/lib64"); \
SEARCH_DIR("=/lib64"); \
SEARCH_DIR("=/usr/lib64"); \
SEARCH_DIR("=/usr/local/lib"); \
SEARCH_DIR("=/lib"); \
SEARCH_DIR("=/usr/lib"); \
SEARCH_DIR("=/usr/x86_64-linux-gnu/lib64"); \
SEARCH_DIR("=/usr/x86_64-linux-gnu/lib");
#include "..." search starts here:
#include <...> search starts here:
/usr/lib/gcc/x86_64-linux-gnu/5/include
/usr/local/include
/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed
/usr/include/x86_64-linux-gnu
/usr/include
显示,例如:
#include "..." search starts here:
#include <...> search starts here:
/usr/include/c++/5
/usr/include/x86_64-linux-gnu/c++/5
/usr/include/c++/5/backward
/usr/lib/gcc/x86_64-linux-gnu/5/include
/usr/local/include
/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed
/usr/include/x86_64-linux-gnu
/usr/include
#包括“…”搜索从这里开始:
#包括搜索从这里开始:
/usr/include/c++/5
/usr/include/x86_64-linux-gnu/c++/5
/usr/include/c++/5/backward
/usr/lib/gcc/x86_64-linux-gnu/5/include
/usr/本地/包括
/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed
/usr/include/x86_64-linux-gnu
/usr/包括
与库相关的是,可移植的Posix选项
标题为/usr/local/include
和/usr/include
所以它是在/usr/local/{include | lib}
和/usr/{include | lib}
之间的选择。但是考虑一下
在/usr/{include | lib}
下安装文件时,您将更改
以不受控制的方式清点发行版的库和头文件
通过其软件包管理系统。如果它是Debian 8.2,那么它就不会再有了。
一旦你开始这样做,一旦你迈出了错误的一步,打破了你的包裹,
这完全是你的问题
Unix和Linux对于您构建的软件的安装有一个约定
您自己或来自受发行版包管理控制的源包
系统,明智地保护您的分销的稳定性。公约是:
在/usr/local/{include | bin | lib}
中安装它。这正是/usr/local
的含义
因为
底线:安装您的库