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

lin*_*uxx 93 c++ compiler-construction gcc g++

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

小智 100

创建.o文件:

g++ -c header.cpp
Run Code Online (Sandbox Code Playgroud)

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

ar rvs header.a header.o
Run Code Online (Sandbox Code Playgroud)

使用库:

g++ main.cpp header.a
Run Code Online (Sandbox Code Playgroud)

  • @unapersson:为什么?可执行文件是_not_的`a.out`格式,因此这具有很大的误导性.为什么你"永远"不应该创建一个名为`test`的可执行文件? (11认同)
  • @unapersson:不,我说的正是我所说的.可执行文件不再以`a.out`格式生成,但由于遗留原因,名称仍然存在.(如果你没能正确使用shell那么那就是你的问题;我知道如何从当前目录运行一个可执行文件.`test`是_just fine_的可执行文件名,只要你写的只是一个快速的测试片段当然.) (10认同)
  • @Tomalak Geret'kal:我想这与`test`是系统命令这一事实有关.但是由于测试程序通常永远不会安装在系统bin目录中,并且要求你编写`./test`,这对我来说也不是问题...... (5认同)
  • 命名一个可执行的`test`是我学会了后悔的难点,我"完全有能力使用shell".这是一个坏主意,我已经看到它咬了许多"完全有能力使用外壳"的人. (4认同)
  • g ++ test.cpp header.a -o test,不是吗? (3认同)
  • @Tomalak因为test是一个内置的shell,如果你没有明确地运行程序为./test(你将不可避免地无法做到),你会选择它而不是你的程序,结果非常混乱.你是说该命令不会产生一个名为a.out的可执行文件? (2认同)

Sri*_*ram 38

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

ar crf lib/libHeader.a header.o
Run Code Online (Sandbox Code Playgroud)

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

mkdir lib
Run Code Online (Sandbox Code Playgroud)

然后运行上面的ar命令.

链接所有库时,您可以这样做:

g++ test.o -L./lib -lHeader -o test  
Run Code Online (Sandbox Code Playgroud)

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

test.o的创建方式如下:

g++ -c test.cpp -o test.o 
Run Code Online (Sandbox Code Playgroud)

  • 它不是`-lHeader`而不是`-llibHeader`? (18认同)
  • lib / libHeader.a是什么?ar rcs ...不是比ar crf好吗? (2认同)

Lig*_*ica 25

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

是.

创建.o(按照正常情况):

g++ -c header.cpp
Run Code Online (Sandbox Code Playgroud)

创建存档:

ar rvs header.a header.o
Run Code Online (Sandbox Code Playgroud)

测试:

g++ test.cpp header.a -o executable_name
Run Code Online (Sandbox Code Playgroud)

请注意,只使用一个模块进行存档似乎毫无意义.你可以很容易地写出来:

g++ test.cpp header.cpp -o executable_name
Run Code Online (Sandbox Code Playgroud)

尽管如此,我还是会怀疑您的实际用例有点复杂,模块更多.

希望这可以帮助!

  • 好一个!有时我们会看到“ ranlib”,在GNU中仅表示“ ar s”。 (2认同)