如何使用g ++创建静态库?


101

有人可以告诉我如何从.cpp和.hpp文件创建静态库吗?我需要创建.o和.a吗?我也想知道如何在其中编译静态库并在其他.cpp代码中使用它。我有header.cppheader.hpp .我想创造header.a。在中测试header.a test.cpp。我正在使用g ++进行编译。


3
您能否接受@NeilButterworth的回答(或其他)?
einpoklum

Answers:


110

创建一个.o文件:

g++ -c header.cpp

将此文件添加到库中,如有必要,创建库:

ar rvs header.a header.o

使用库:

g++ main.cpp header.a

3
g ++ test.cpp标头。-o测试,不是吗?
linuxx 2011年

11
@unapersson:为什么?可执行文件的格式不正确a.out因此极易引起误解。以及为什么不应该“从不”创建一个名为的可执行文件test
轨道轻度竞赛

5
@Tomalak Geret'kal:我想这与test系统命令有关。但是由于测试程序通常永远不会安装在系统bin目录中并且需要您编写,./test所以这对我来说也不是什么大问题……
ereOn 2011年

10
@unapersson:不,我是说我的话。可执行文件不再以a.out格式生成,但由于遗留原因而保留了该名称。(如果您不能正确使用shell,那就是您的问题;我曾经知道如何从当前目录运行可执行文件。对于可执行文件名称test来说就很好,只要您编写的是快速测试代码段。)
轻轨赛将于

4
命名可执行文件test是我很难后悔的事情,而且我“完全有能力使用Shell”。这是一个坏主意,我已经看到它咬伤了许多“完全能够使用外壳”的人。
总统詹姆斯·波尔克(James K. Polk)2013年

46

您可以.a使用该ar实用程序创建文件,如下所示:

ar crf lib/libHeader.a header.o

lib是包含所有库的目录。优良作法是用这种方式组织代码并将代码和目标文件分开。将所有内容放在一个目录中通常看起来很丑。上一行libHeader.a在目录中创建lib。因此,在当前目录中,执行以下操作:

mkdir lib

然后运行上面的ar命令。

链接所有库时,可以这样进行:

g++ test.o -L./lib -lHeader -o test  

-L标志将把目录g++添加lib/到路径中。这样,g++在查找时便知道要搜索的目录libHeader-llibHeader标记要链接的特定库。

创建test.o的地方是这样的:

g++ -c test.cpp -o test.o 

2
lib / libHeader.a是什么?ar rcs ...不是比ar crf好吗?
linuxx 2011年

1
@linuxx:main.o将是您从main.cc中创建的目标文件
Sriram,

@linuxx:与ar实用程序一起使用的确切标志是根据您的要求决定的。查找手册页中的ar将是一个好主意。
斯里拉姆

如何使用test.cpp测试库?
linuxx 2011年

19
那岂不是-lHeader不是-llibHeader
Dolanor 2012年

30

有人可以告诉我如何从.cpp和.hpp文件创建静态库吗?我需要创建.o和.a吗?

是。

创建.o(按照常规):

g++ -c header.cpp

创建档案

ar rvs header.a header.o

测试

g++ test.cpp header.a -o executable_name

请注意,仅使用一个模块进行归档似乎有点没有意义。您可以很容易地写出:

g++ test.cpp header.cpp -o executable_name

尽管如此,我还是会给您带来疑问的好处,即您的实际用例会更复杂,带有更多的模块。

希望这可以帮助!


1
我们如何包含多个模块?
西丁·托马斯

2
好一个!有时,我们会看到ranlibGNU中的简单含义ar s
越南
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.