如何使用 g++ 创建静态库?
Posted
技术标签:
【中文标题】如何使用 g++ 创建静态库?【英文标题】:How to create a static library with g++? 【发布时间】:2011-08-22 06:27:30 【问题描述】:谁能告诉我如何从 .cpp 和 .hpp 文件创建静态库?我需要创建 .o 和 .a 吗?我还想知道如何编译静态库并在其他 .cpp 代码中使用它。我有header.cpp
,header.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++ 创建静态库?的主要内容,如果未能解决你的问题,请参考以下文章