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

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

【问题讨论】:

    标签: c++ gcc compiler-construction 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 是我学会了后悔的艰难方法,我“完全有能力使用外壳”。这是一个坏主意,而且我已经看到它咬了许多“完全有能力使用外壳”的人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 2014-09-17
    相关资源
    最近更新 更多