linux 下编译c程序与动态链接库
1 动态库h文件和c文件
1.1 h 文件: kaflog4c.h
/** * kaflog4c.h */ #include <stdio.h> #include <stdlib.h> void hello(const char *msg);
1.2 c 文件: kaflog4c.c
/** * kaflog4c.c */ #include "kaflog4c.h" void hello(const char *msg) { printf("Hello %s!\n", msg); }
2 编译要产生动态库和静态库
2.1 编译动态库:libkaflog4c.so
$ gcc -W -Wall -fPIC -ansi -pedantic -I. -c kaflog4c.c $ gcc -shared kaflog4c.o -o libkaflog4c.so
2.2 编译静态库:libkaflog4c.a
$ ar r libkaflog4c.a kaflog4c.o
3 程序文件
3.1 main.c
编译要产生链接到动态库(libkaflog4c.so)的程序和静态库(libkaflog4c.a)的程序
/** * main.c */ #include "kaflog4c.h" int main () { hello("cheungmine"); return 0; }
1) 编译链接到动态库libkaflog4c.so的测试程序main:
$ gcc -W -Wall -ansi -pedantic -I. -c main.c $ gcc main.o -o main ./libkaflog4c.so # 查看依赖 $ ldd ./main # 运行 $ ./main
2) 编译链接到静态库libkaflog4c.a的测试程序main:
$ gcc main.o -o main ./libkaflog4c.a $ ldd ./main # 此时删除libkaflog4c.a和libkaflog4c.so对下面的执行无影响 $ ./main
3.2 main_dl.c
/** * main_dl.c */ #include "kaflog4c.h" #include <dlfcn.h> void dl_hello() { void *dp; void (*fn_hello)(const char*); dp = dlopen("libkaflog4c.so", RTLD_LAZY); if (!dp) { printf("%s\n", dlerror()); exit(1); } fn_hello = dlsym(dp, "hello"); if (!fn_hello) { printf("%s\n", dlerror()); exit(1); } fn_hello("cheungmine: load library when running"); dlclose(dp); } int main() { dl_hello(); return 0; }
编译运行时动态加载动态库libkaflog4c.so的程序
(libkaflog4c.so已经存在于当前目录下)
$ gcc -W -Wall -ansi -I. -c main_dl.c $ gcc main_dl.o -o main_dl -ldl $ ldd main_dl $ ./main_dl $ sudo mv ./libkaflog4c.so /usr/local/lib/ $ ./main_dl libkaflog4c.so: cannot open shared object file: No such file or directory $ sudo ldconfig $ ./main_dl
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-13 22:54:34