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

Posted

技术标签:

【中文标题】如何使用 g++ 创建静态库?【英文标题】:How to create a static library with g++? 【发布时间】:2011-08-22 06:27:30 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

ar crf lib/libHeader.a header.o

lib 是一个包含所有库的目录。以这种方式组织代码并将代码和目标文件分开是一种很好的做法。将所有内容放在一个目录中通常看起来很难看。上面的行在目录lib 中创建了libHeader.a。所以,在你的当前目录中,执行:

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 

【讨论】:

lib/libHeader.a 是什么? ar rcs ...不是比 ar crf 好吗? @linuxx: main.o 将是您从 main.cc 创建的目标文件 @linuxx:您与 ar 实用程序一起使用的确切标志是您根据您的要求决定的。查找 ar 的手册页是个好主意。 如何使用 test.cpp 测试库? 不会是-lHeader 而不是-llibHeader 吗?【参考方案2】:

谁能告诉我怎么做 从 .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

不过,我会告诉你,你的实际用例有点复杂,模块更多。

希望这会有所帮助!

【讨论】:

我们如何包含多个模块? 好一个!有时我们会看到ranlib,在 GNU 中仅表示 ar s【参考方案3】:

创建一个 .o 文件:

g++ -c header.cpp

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

ar rvs header.a header.o

使用库:

g++ main.cpp header.a

【讨论】:

g++ test.cpp header.a -o test,no? @unapersson:为什么?可执行文件 not 采用a.out 格式,因此具有高度误导性。为什么你应该“从不”创建一个名为 test 的可执行文件? @Tomalak Geret'kal:我想这与test 是一个系统命令有关。但是由于测试程序通常不会安装在系统 bin 目录中,并且需要您编写./test,所以对我来说也不是什么大问题... @unapersson:不。我说的正是我所说的。可执行文件不再以a.out 格式生成,但由于遗留原因,该名称仍然存在。 (如果您无法正确使用 shell,那么这就是您的问题;我知道如何从当前目录运行可执行文件。test 对于可执行文件名称就好了,如当然,只要你只是写一个快速测试 sn-p。) 命名一个可执行文件test 是我学会了后悔的艰难方法,我“完全有能力使用外壳”。这是一个坏主意,而且我已经看到它咬了许多“完全有能力使用外壳”的人。

以上是关于如何使用 g++ 创建静态库?的主要内容,如果未能解决你的问题,请参考以下文章

如何在静态库中编译程序?

linux下,有几个.so。如何将这几个动态库编译成一个动态库

如何强制gcc链接未使用的静态库

如何在Xcode中使用静态库

使用 dpc++ 从 sycl 程序创建静态或共享库

如何在android使用已经有的静态库