C/C++动态链接库的简单使用


C语言下最简单的动态链接库demo

实现一个demo,在main.c中调用动态链接库中的add函数。

准备源码

首先实现add函数,在add.c中实现以下内容。

int add(int a, int b)
{
    return a+b;
}

在add.h中实现以下内容。

#ifndef ADD_H_
#define ADD_H_

int add(int a,int b);


#endif /* MAX_H_ */

在main.c中包含头文件并调用函数。

#include<stdio.h>
#include "add.h"
int main()
{
    int a = 10, b = 20;
    printf("Sum of %d and %d is %d\n", a, b, add(a, b));
    return 0;
}

编译运行

  1. 编译动态链接库。

    gcc --shared -fPIC -o libadd.so add.c
  1. 编译主函数

    gcc -o main main.c -L. -ladd
  1. 运行。

    $ ./main
    Sum of 10 and 20 is 30
    

C语言实现的动态链接库在C++中调用

如果直接使用

#include
#include "add.h"
int main()
{
    int a = 10, b = 20;
    printf("Sum of %d and %d is %d\n", a, b, add(a, b));
    std::cout << "Sum of " << a << " and " << b << " is " << add(a, b) << "\n";
    return 0;
}

编译

$ g++ -o main2 main2.cpp -L. -ladd
/usr/bin/ld: /tmp/cc0fInkR.o: in function `main':
main2.cpp:(.text+0x26): undefined reference to `add(int, int)'
/usr/bin/ld: main2.cpp:(.text+0xa4): undefined reference to `add(int, int)'
collect2: error: ld returned 1 exit status

需要为头文件add.h做更改

#ifndef ADD_H_
#define ADD_H_

#ifdef __cplusplus
extern "C"  //C++
{
#endif
   int add(int a,int b);
#ifdef __cplusplus
}
#endif

#endif /* MAX_H_ */

再重新编译动态链接库,再编译就可以。


# rui @ rdma221 in ~/nfs/code/cc_code_test/dynamic_dll [12:38:49] C:1
$ gcc --shared -fPIC -o libadd.so add.c

# rui @ rdma221 in ~/nfs/code/cc_code_test/dynamic_dll [12:40:35]
$ g++ -o main2 main2.cpp -L. -ladd

# rui @ rdma221 in ~/nfs/code/cc_code_test/dynamic_dll [12:40:37]
$ ./main2
Sum of 10 and 20 is 30
Sum of 10 and 20 is 30

动态连接库更改时不重新编译主程序?

更改动态链接库内容如下

int add(int a, int b)
{
    return (a+b)*2;
}

重新编译动态链接库但是不编译主程序,查看运行结果。

# rui @ rdma221 in ~/nfs/code/cc_code_test/dynamic_dll [12:41:00]
$ gcc --shared -fPIC -o libadd.so add.c

# rui @ rdma221 in ~/nfs/code/cc_code_test/dynamic_dll [12:43:18]
$ ./main2
Sum of 10 and 20 is 60
Sum of 10 and 20 is 60

说明在更改动态库时不需要重新编译主程序也能够生效。

如果是静态库呢?


评论
评论
 本篇
C/C++动态链接库的简单使用 C/C++动态链接库的简单使用
C语言下最简单的动态链接库demo实现一个demo,在main.c中调用动态链接库中的add函数。 准备源码首先实现add函数,在add.c中实现以下内容。 int add(int a, int b) { return a+b; }
2023-06-21 Zhang Rui
下一篇 
家里产的茶叶 家里产的茶叶
来自安徽大别山的茶叶虽然清明节在昨天已经过去,但是我们家那边的茶才上市不到一周。因为我们家深处大别山,海拔较高,温度低,所以茶叶上市要比正常的晚很多。茶叶从村里的农户里收集,然后在我家用一些机器进行加工。 我家主推的有毛峰和禅茶两种。目前上
2022-03-09 Zhang Rui
  目录