`

使用g++创建静态库

 
阅读更多
静态库是编译器生成的一系列对象文件的集合。链接一个程序时用库中的对象文件还是目录中的对象文件都是一样的。库中的成员包括普通函数,类定义,类的对象实例等等。静态库的另一个名字叫归档文件(archive),管理这种归档文件的工具叫 ar 。

在下面的例子中,我们先创建两个对象模块,然后用其生成静态库。

头文件 say.h 包含函数 sayHello() 的原型和类 Say 的定义:
/* say.h */
#include <iostream>
void sayhello(void);
class Say {
    private:
        char *string;
    public:
        Say(char *str)
        {
            string = str;
        }
        void sayThis(const char *str)
        {
            std::cout << str << " from a static library\n";
        }
        void sayString(void);
};

下面是文件 say.cpp 是我们要加入到静态库中的两个对象文件之一的源码。它包含 Say 类中 sayString() 函数的定义体;类 Say 的一个实例 librarysay 的声明也包含在内:
/* say.cpp */
#include "say.h"
void Say::sayString()
{
    std::cout << string << "\n";
}
 
Say librarysay("Library instance of Say");

源码文件 sayhello.cpp 是我们要加入到静态库中的第二个对象文件的源码。它包含函数 sayhello() 的定义:
/* sayhello.cpp */
#include "say.h"
void sayhello()
{
    std::cout << "hello from a static library\n";
}


下面的命令序列将源码文件编译成对象文件,命令 ar 将其存进库中:

$ g++ -c sayhello.cpp
$ g++ -c say.cpp
$ ar -r libsay.a sayhello.o say.o

程序 ar 配合参数 -r 创建一个新库 libsay.a 并将命令行中列出的对象文件插入。采用这种方法,如果库不存在的话,参数 -r 将创建一个新的库,而如果库存在的话,将用新的模块替换原来的模块。

下面是主程序 saymain.cpp,它调用库 libsay.a 中的代码:
/* saymain.cpp */
#include "say.h"
int main(int argc,char *argv[])
{
    extern Say librarysay;
    Say localsay = Say("Local instance of Say");
    sayhello();
    librarysay.sayThis("howdy");
    librarysay.sayString();
    localsay.sayString();
    return(0);
}

该程序可以下面的命令来编译和链接:
$ g++ saymain.cpp libsay.a -o saymain

程序运行时,产生以下输出:
hello from a static library
howdy from a static library
Library instance of Say
Local instance of Say
分享到:
评论

相关推荐

    linux下g++编译与使用静态库和动态库

    Linux 下 g++ 编译与使用静态库和动态库 Linux 下 g++ 编译与使用静态库和动态库是 Linux 开发中一个非常重要的知识点。静态库(*.a)和动态库(*.so)是 Linux 下两种常用的库文件类型,了解它们的生成和使用方法...

    动态库、静态库的创建与连接

    例如,在 Linux 下,可以使用以下命令创建静态库: ```bash g++ -c StaticMath.cpp ar -crv libstaticmath.a StaticMath.o ``` 二、动态库 动态库是一种链接库,它在运行时期将库文件加载到内存中。动态库的特点...

    9.C++静态库和动态库1

    2. 接着使用`lib`工具链接目标文件创建静态库,或者更常见的是在VS的项目设置中选择静态库作为配置类型,然后编译项目。 使用静态库时,我们需要在编译链接阶段指定库的位置(`-L`选项)和库名(`-l`选项,不需要`...

    dpdk静态库编译lib-dpdk.lib

    5. **创建静态库`lib-dpdk.lib`** DPDK默认生成的静态库文件可能不是`lib-dpdk.lib`这个名字,所以需要将所有必要的静态库合并成一个名为`lib-dpdk.lib`的文件。这可以通过`ar`工具完成,例如: ``` ar -crs lib...

    GCC 开发AVR 单片机程序-静态库的使用

    ### GCC 开发AVR 单片机程序-静态库的使用 #### 1. 静态库的生成 在GCC环境下开发AVR单片机程序时,利用静态库能够显著减少程序的代码体积和内存占用,从而优化资源管理。静态库的生成是通过将多个`.o`(目标)...

    编译与加载静态库(.a)

    下面将详细介绍静态库的创建、使用以及相关工具。 ### 静态库的创建 1. **源码编译**:首先,你需要拥有编写静态库的源代码。这些代码通常包含在一系列的 `.c` 或 `.cpp` 文件中。 2. **预处理对象文件**:使用 `...

    C++创建调用静态动态库

    3. 构建静态库:使用`ar rcs libstatic.a libfunc.o`命令将对象文件打包成静态库`libstatic.a`。 二、动态库 动态库在运行时被加载,可以节省磁盘空间和内存,因为多个程序可以共享同一份库。在Linux中,动态库的...

    静态库验证静态库验证静态库验证

    2. **创建静态库**:开发者通常使用`ar`工具或`libtool`在Unix/Linux系统中创建静态库,而在Windows环境下则可能使用`lib.exe`。以`ar`为例,创建静态库的命令通常为`ar crs library.a object_files`,其中`library....

    makefile编写动态库和静态库

    创建静态库(.a)** 静态库是一组预编译的对象文件,链接时会被直接包含到可执行文件中。下面是如何创建一个名为libmylib.a的静态库: ```make AR = ar RANLIB = ranlib libmylib.a: mylib.o $(AR) rcs libmylib....

    C++动态库和静态库的使用.rar

    2. **创建静态库**:在Windows环境下,可以使用`lib.exe`工具,而在Linux下,可以使用`ar`命令来打包目标文件生成静态库。 3. **链接静态库**:在编译时,需要指定静态库路径(例如-L)和库名(例如-l),链接器会将...

    01_动态库和静态库.doc

    【创建静态库的步骤】 1. 编译源代码为对象文件(.o 或 .obj)。 2. 使用`ar`或`lib.exe`将对象文件打包成静态库。 例如,在Linux下,创建名为`libstaticmath.a`的静态库,需要先编译`StaticMath.cpp`为`Static...

    QNX系统中添加自己编译的.so库.zip_QNX .so文件_SO打包_qnx文件_qnx系统g++编译_so库

    与静态库(.a文件)不同,动态库不会被编译进可执行文件,而是运行时按需加载,这有助于减少程序的内存占用和启动时间。 在QNX系统中,使用g++编译器来创建.so库。以下是基本步骤: 1. **编写源代码**:使用C++...

    Linux静态库编译

    如果项目中有多个源文件,如`additions.c`和`multiplications.c`,我们同样先分别编译为对象文件,再创建静态库: ```bash gcc -c additions.c gcc -c multiplications.c ar rcs libmath.a additions.o ...

    需链接动态库静态库,且先需编译库的makefile

    2. **创建静态库**:使用`ar`工具创建静态库。例如,`ar -rcs libstatic.a file1.o file2.o`将`file1.o`和`file2.o`打包为名为`libstatic.a`的静态库。 3. **编译并链接动态库**:对于动态库,需要使用`gcc`或`g++`...

    C/C++静态库和动态库的编译

    这个压缩包中的"静态库和动态库实验"可能包含一系列的源码示例,用于演示如何创建、使用静态库和动态库。通过实际操作这些示例,开发者可以深入理解库的编译过程,并学会在自己的项目中应用这些技术。 总结一下,本...

    cximage_linux_静态库

    在实际应用中,开发人员通常会通过链接器将这些静态库与自己的应用程序代码合并,创建一个独立的可执行文件。这需要在编译时指定正确的链接选项,确保所有依赖的库都被正确地包含进来。例如,使用g++编译器时,可能...

    GCC静态库和共享库的生成及调用

    创建静态库的命令为: `$ar rcs libhello.a hello.o` 其中,`libhello.a` 是静态库的文件名,`hello.o` 是对象文件。 共享库 共享库是在程序编译时并不会被连接到目标代码中,而是在程序运行时才被载入。一个...

    需链接动态库静态库,且需先编译库的makefile

    链接静态库使用`ar`命令创建库,`gcc`或`g++`编译时使用`-l`选项: ```makefile AR = ar ARFLAGS = rcs CFLAGS = -Wall all: my_program libmystaticlib.a: static_lib.o $(AR) $(ARFLAGS) $@ $^ my_program: ...

    Linux编译动态库和静态库

    在Linux系统中,开发软件时常会遇到需要创建和使用动态库(.so)与静态库(.a)的情况。动态库允许多个程序共享同一份代码,节省内存资源,而静态库则将库代码直接编译进目标程序,不依赖外部环境。本篇将详细介绍在...

    C生成静态库给C++调用出现undefined reference to ...解决方案_cpp

    在C语言中,我们使用`ar`工具创建静态库(.a或.lib文件)。在Linux下,命令可能如下: ```bash gcc -c -o src_file.o src_file.c ar rcs libmylib.a src_file.o ``` 在Windows环境下,使用`lib.exe`: ```cmd cl /c ...

Global site tag (gtag.js) - Google Analytics