Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使library.a文件与gcc/g++;_Gcc_Installation_Linker_Posix_Static Libraries - Fatal编程技术网

如何使library.a文件与gcc/g++;

如何使library.a文件与gcc/g++;,gcc,installation,linker,posix,static-libraries,Gcc,Installation,Linker,Posix,Static Libraries,当我想编译一些使用libspotify的东西时,例如,我可以通过在compilation命令中包含术语-lspotify来链接libspotify库,然后一切都可以正常工作 如果我正在编写和安装我自己的库,我应该将.a文件放在哪里(或者在任何情况下我应该做什么),以便能够以相同的方式链接到我的库 如果有问题,这个问题涉及Posix系统。目前我对如何在Windows中实现这一点不感兴趣。只要链接器(ld)知道在哪里查找,就可以将库放在任何地方 为了它 链接器如何知道在哪里查找库 您可以通过命令行选

当我想编译一些使用libspotify的东西时,例如,我可以通过在compilation命令中包含术语
-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
的含义 因为

底线:安装您的库