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;
}
编译运行
编译动态链接库。
gcc --shared -fPIC -o libadd.so add.c
编译主函数
gcc -o main main.c -L. -ladd
运行。
$ ./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
说明在更改动态库时不需要重新编译主程序也能够生效。
如果是静态库呢?