以下是关于C++静态库与动态库文件的生成和使用教程的详细攻略。
什么是C++静态库和动态库?
C++库文件是编写的代码的编译结果,可以用来在其他项目中共享代码。C++库文件可以分为静态库和动态库两种。
-
静态库(Static Library)是指在链接过程中,将库的代码和目标程序的代码一起组合成一个可执行程序。静态库编译后的文件后缀名通常为
.a
(Unix)或.lib
(Windows)。 -
动态库(Dynamic Library) 是指在程序运行过程中,根据需要载入的库。动态库编译后的文件后缀名通常为
.so
(Unix)或.dll
(Windows)。
生成C++静态库
下面我们通过一个示例来了解如何生成和使用C++静态库文件。
首先,我们编写一个C++程序:
//mylib.h
#ifndef MYLIB_H
#define MYLIB_H
void hello_world();
#endif
//mylib.cpp
#include <iostream>
#include "mylib.h"
void hello_world()
{
std::cout << "Hello World" << std::endl;
}
接着,我们需要生成库文件。按照下面的步骤进行:
- 首先,将C++源代码编译成目标文件。这里我们使用
g++
编译器,并指定生成目标文件mylib.o
,命令如下:
g++ -c mylib.cpp -o mylib.o
- 然后,使用
ar
命令将目标文件打包成静态库文件。静态库文件的文件名一般以lib
开头,后面跟着库的名称和后缀名.a
。下面是生成名为libmylib.a
的静态库的命令:
ar rcs libmylib.a mylib.o
其中:
r
: 将目标文件添加(或替换)到库中c
: 如果库不存在,则创建它-
s
: 在库中添加索引,加速链接器连接库的速度 -
生成静态库文件后,我们可以使用这个库文件编译我们的程序。下面是示例程序
main.cpp
:
#include "mylib.h"
int main()
{
hello_world();
return 0;
}
我们可以通过下面的命令将程序和静态库链接成一个可执行文件:
g++ main.cpp -L. -lmylib -o static_demo
其中:
-L.
:指定在当前目录查找库文件-lmylib
:指定静态库的名称,去掉前缀lib
和后缀.a
运行的时候,我们可以看到输出了Hello World
。
生成C++动态库
接下来我们看一下如何生成和使用C++动态库文件。同样我们通过一个示例来说明。
首先,我们需要编写动态库的代码:
// mylib.h
#ifndef MYLIB_H
#define MYLIB_H
#ifdef WIN32
# define MYLIB_API __declspec(dllexport)
#else
# define MYLIB_API
#endif
void MYLIB_API hello_world();
#endif
// mylib.cpp
#include <iostream>
#include "mylib.h"
void MYLIB_API hello_world()
{
std::cout << "Hello World" << std::endl;
}
注意到动态库的hello_world()
函数添加了MYLIB_API
宏,我们将在后续编译动态库时使用。
然后,我们需要生成动态库文件。按照下面的步骤进行:
- 编译动态库的源代码,生成
mylib.o
。
g++ -fPIC -c mylib.cpp -o mylib.o
- 生成动态库。动态库的文件名和静态库的文件名类似,只不过后缀是
.so
(Linux)或.dll
(Windows)。生成Linux下的libmylib.so
(Windows下生成的是mylib.dll
)的命令如下:
g++ -shared -o libmylib.so mylib.o
注意到这里使用了-shared
选项生成共享库。
- 将动态库安装到系统路径。我们可以将动态库安装在默认路径下
/usr/local/lib
中,这样系统查找库文件时会自动搜索这个路径。生成安装命令如下:
sudo cp libmylib.so /usr/local/lib
sudo ldconfig
ldconfig
命令会将/usr/local/lib
目录中的动态库添加到系统的动态库链接路径中,使得系统在运行时可以正确找到动态库文件。
- 生成动态库后,我们可以使用下面的命令编译我们的程序:
g++ main.cpp -L. -lmylib -Wl,-rpath=/usr/local/lib -o dynamic_demo
其中:
-L.
:指定在当前目录查找库文件-lmylib
:指定动态库的名称,去掉前缀lib
和后缀.so
-Wl,-rpath=/usr/local/lib
:指定运行时动态库的搜索路径
注意到这里我们需要指定运行时动态库的搜索路径-Wl,-rpath=/usr/local/lib
,使得程序能够正确在运行时链接到动态库文件。
运行程序后,我们可以看到输出了Hello World
。
示例说明
以上静态库和动态库生成的过程都包含了示例程序的使用方法。这里再给出一些示例,以用于更好的理解。
示例1:使用静态库的程序
#include <iostream>
#include "mylib.h"
int main()
{
hello_world();
return 0;
}
我们可以通过下面的命令将程序和库链接成一个可执行文件:
g++ main.cpp -L. -lmylib -o static_demo
运行的时候,我们可以看到输出了Hello World
。
示例2:使用动态库的程序
#include <iostream>
#include "mylib.h"
int main()
{
hello_world();
return 0;
}
我们可以通过下面的命令将程序和动态库链接成一个可执行文件:
g++ main.cpp -L. -lmylib -Wl,-rpath=/usr/local/lib -o dynamic_demo
运行的时候,我们可以看到输出了Hello World
。
以上就是关于C++静态库和动态库的生成和使用教程的完整攻略,希望对大家有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++静态库与动态库文件的生成和使用教程 - Python技术站