Linux下动态库的创建与使用

1  动态库的创建
动态库的创建很容易也有一定的技巧
如:
dynamic,h文件
class zyx
{
private:
        int a;
        int b;
public:
        zyx(int a,int b);
        int sum();
};
dynamic.cpp文件
#include"dynamic.h"
zyx::zyx(int a,int b)
{
        this->a = a;
        this->b = b;
}

int zyx::sum(int a,int b)
{
        return a+b;
}
编写完成以后我们可以编译了
 gcc -fpic -shared -o libdynamic.so dynamic.cpp
-fpic指的是生成与位置无关的文件
-shared指连接成共享库
这样我们的共享库就建立起来了不过我们最好把dynamic.h放到usr/include目录下把dynamic.cpp放到usr/lib下。这样有一个好处。就是我们可以让系统自动寻找他们。

2 共享库的使用
我们同样首先些一段测试的代码
#include<iostream>
#include<dynamic.h>
using namespace std;
int main()
{
        zyx z(1,2);
        cout<<z.sum()<<endl;
        return 0;
}
这样我们就可以编译了
g++ dynamictest.cpp -o dynamictest -ldynamic
如果没有将dynamic.h放到usr/include目录下把dynamic.cpp放到usr/lib下要手动指定include lib文件在哪里
g++ dynamictest.cpp -o dynamictest -I./ -L./ -ldynamic
其实,调用共享库有两种方法这只是其中一种比较简单的隐式调用,还有一种显示调用要生命一个外部的类的实例化函数,然后通过这个函数取得类的构造函数,相对来讲比较麻烦,这里就不说了。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux库文件可以分为静态库和动态库两种形式。静态库的文件名通常以“.a”结尾,而动态库的文件名通常以“.so”结尾。 ### 静态库 静态库是一组函数和数据的集合,它们被打包成一个单独的文件,与程序一起链接并在程序运行时加载到内存中。静态库在程序编译时就被链接到可执行文件中,因此它们不需要在运行时再次加载到内存中。 #### 创建静态库 1. 编写源代码文件,例如 `mylib.c` 。 2. 编译源代码文件,生成目标文件 `mylib.o` : ``` gcc -c mylib.c -o mylib.o ``` 3. 将目标文件打包成静态库文件 `libmylib.a` : ``` ar rcs libmylib.a mylib.o ``` 其中,`ar` 是一个用于创建、修改和提取归档文件的工具,`rcs` 分别表示创建、替换和添加目标文件到归档文件中。 #### 使用静态库 在编译程序时,需要指定要使用的静态库文件。例如,编写一个使用 `mylib` 静态库的程序: 1. 编写源代码文件 `main.c` ,包含 `mylib.h` 头文件: ```c #include <stdio.h> #include "mylib.h" int main() { int result = add(1, 2); printf("The result is %d\n", result); return 0; } ``` 2. 编译源代码文件,链接 `libmylib.a` 静态库: ``` gcc main.c -L. -lmylib -o main ``` 其中,`-L.` 指定要搜索的库文件路径为当前目录,`-lmylib` 指定要链接的静态库文件名为 `libmylib.a` 。 ### 动态库 动态库也是一组函数和数据的集合,但它们与程序不是在编译时就被链接,而是在程序运行时动态加载到内存中。因此,动态库的优点是可以节省内存空间,多个程序可以共享同一个动态库。 #### 创建动态库 1. 编写源代码文件,例如 `mylib.c` 。 2. 编译源代码文件为共享目标文件 `libmylib.so` : ``` gcc -shared -fPIC mylib.c -o libmylib.so ``` 其中,`-shared` 表示生成共享目标文件,`-fPIC` 表示在编译时生成位置独立的代码。 #### 使用动态库 在编译程序时,需要指定要使用动态库文件。例如,编写一个使用 `mylib` 动态库的程序: 1. 编写源代码文件 `main.c` ,包含 `mylib.h` 头文件: ```c #include <stdio.h> #include "mylib.h" #include <dlfcn.h> int main() { void *handle = dlopen("./libmylib.so", RTLD_LAZY); if (!handle) { printf("Failed to load library.\n"); return 1; } int (*add)(int, int) = dlsym(handle, "add"); if (!add) { printf("Failed to find symbol.\n"); return 1; } int result = add(1, 2); printf("The result is %d\n", result); dlclose(handle); return 0; } ``` 2. 编译源代码文件,链接 `libdl.so` 动态库: ``` gcc main.c -ldl -o main ``` 其中,`-ldl` 指定要链接的动态库文件名为 `libdl.so` ,它是用于动态加载库文件的标准Linux动态库

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值