代码之家  ›  专栏  ›  技术社区  ›  Intellectual Gymnastics Lover

如何创建一个与c/c++标准库静态链接的静态库?

c++
  •  0
  • Intellectual Gymnastics Lover  · 技术社区  · 3 年前

    我想创建一个简单的静态库 my_math.lib 。其头文件和源文件如下。

    // my_math.h
    #ifndef MY_MATH_H
    #define MY_MATH_H
    
    double reciprocal(double d);
    #endif
    
    // my_math.cpp
    #include "my_math.h"
    #include <iostream>
    double reciprocal(double d)
    {
        std::cout << __func__ << std::endl;
    
        return 1.0 / d;
    }
    

    为了学习的目的,我按照以下离散步骤编译它:

    1. 预处理: cpp my_math.cpp > my_math.ii
    2. 编译: g++ -S my_math.ii (输出为 my_math.s 默认情况下)
    3. 装配: as my_math.s -o my_math.o
    4. 归档: ar rvs my_math.a my_math.o

    提问

    如您所见,我上面的库使用 cout 在c/c++标准库中定义。

    出于学术目的,是否可以创建一个静态库 my_math.lib 静态链接到c/c++库?我没有找到任何文章说明如何做到这一点。

    我们能否将归档步骤扩展到还包括针对c/c++标准库的静态链接?换句话说,是否可以使用 -static 选项由提供 g++ 创建静态库时?

    编辑:

    正如预期的那样 my_math.lib 包含我自己的代码和c/c++标准库,有人使用 my_math.lib 只需要两者都有 my_math.h iostream ,并静态链接 my_math.lib .结果 .exe 二进制不再需要c/c++运行时。这就是我想实现的学术目的!

    0 回复  |  直到 3 年前
        1
  •  0
  •   Second Person Shooter    3 年前

    非常感谢。 PeterT enter image description here 感谢您向我提供以下链接 how to merge two archives or static libraries .

    我希望这个答案将来对其他人也有用。在这里,我想合并 my_math.a 具有 libstdc++.a .

    1. 提取物 my_math.o my_math。一 具有 ar x my_math.a .
    2. 同时提取所有对象 .o 文件来自 libstdc++。一 具有 ar x libstdc++.a .
    3. 可选择使用以下命令删除两个存档 del my_math.a del libstdc++.a .
    4. 将所有目标文件归档 ar c libmerged.a *.o .

    完成。