mysum.c
#include <stdio.h>
#include "mysum.h"
int sum(int a, int b)
{
return (a + b);
}
mysum.h
#ifndef __SRC_H__
#define __SRC_H__
int sum(int a, int b);
#endi
xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ gcc -fPIC -c mysum.c
xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ ls -l
总用量 12
-rw-rw-r-- 1 xushixiong xushixiong 78 12月 17 10:21 mysum.c
-rw-rw-r-- 1 xushixiong xushixiong 69 12月 17 10:18 mysum.h
-rw-rw-r-- 1 xushixiong xushixiong 1232 12月 17 10:21 mysum.o
xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ gcc -shared -o libmysum.so mysum.c
xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ ls -l
总用量 20
-rwxrwxr-x 1 xushixiong xushixiong 7721 12月 17 10:22 libmysum.so
-rw-rw-r-- 1 xushixiong xushixiong 78 12月 17 10:21 mysum.c
-rw-rw-r-- 1 xushixiong xushixiong 69 12月 17 10:18 mysum.h
-rw-rw-r-- 1 xushixiong xushixiong 1232 12月 17 10:21 mysum.o
xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ rm -rf *.so
xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ rm -rf mysum.o
xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ ls -l
总用量 8
-rw-rw-r-- 1 xushixiong xushixiong 78 12月 17 10:21 mysum.c
-rw-rw-r-- 1 xushixiong xushixiong 69 12月 17 10:18 mysum.h
xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ gcc -fPIC -shared -o libmysum.so mysum.c
xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ ls -l
总用量 16
-rwxrwxr-x 1 xushixiong xushixiong 7721 12月 17 10:23 libmysum.so
-rw-rw-r-- 1 xushixiong xushixiong 78 12月 17 10:21 mysum.c
-rw-rw-r-- 1 xushixiong xushixiong 69 12月 17 10:18 mysum.h
执行 动态库静态加载-so测试
test_mysum.c
//#include <stdio.h > // extern int sum(int a, int b);
#include <stdio.h> #include "mysum.h" int main() { int a,b ,c = 0; printf("please input a and b:"); scanf("%d %d",&a,&b); c= sum(a,b); printf("c=%d\n",c); return 0; } |
xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ gcc -o main test_mysum.c -L. -lmysum -Wall
xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ ls -l
总用量 32
-rwxrwxr-x 1 xushixiong xushixiong 7721 12月 17 10:23 libmysum.so
-rwxrwxr-x 1 xushixiong xushixiong 8478 12月 17 10:32 main
-rw-rw-r-- 1 xushixiong xushixiong 82 12月 17 10:32 mysum.c
-rw-rw-r-- 1 xushixiong xushixiong 66 12月 17 10:24 mysum.h
-rw-rw-r-- 1 xushixiong xushixiong 247 12月 17 10:32 test_mysum.c
xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ ./main
./main: error while loading shared libraries: libmysum.so: cannot open shared object file: No such file or directory
xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ gcc -o main test_mysum.c -rdynamic -L. -lmysum -Wall
xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ ./main
./main: error while loading shared libraries: libmysum.so: cannot open shared object file: No such file or directory
执行 ./main时会报告错误,提示无法加载libmysum.so共享库
处理方法有三:
方法一:
将动态库拷贝到
/lib 或
/usr/lib 中去
如: sudo cp libmysum.so /lib 方法二:
改变环境变量:
LD_LIBRARY_PATH=$PWD export LD_LIBRARY_PATH 方法三:
在编译时指定共享库的路径:
gcc -o main1 -Wl,-rpath,.-L. -louyang main.o |
xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ echo $PWD
/workteam/xushixiong/data/remote_linux_C/so_example/genso
xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ echo $pwd
xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ LD_LIBRARY_PATH=$PWD
xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ export LD_LIBRARY_PATH
xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ echo $LD_LIBRARY_PATH
/workteam/xushixiong/data/remote_linux_C/so_example/genso
xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ gcc -o main test_mysum.c -L. -lmysum -Wall
xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ ./main
please input a and b:5 5
c=10
xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ file main
main: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x64760d09b4177ead7c1d1877bc8462fb6de03818, not stripped
xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ gcc -o main test_mysum.c -L. -lmysum -Wall -static
/usr/bin/ld: cannot find -lmysum
collect2: ld 返回 1
xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ echo $LD_LIBRARY_PATH
/workteam/xushixiong/data/remote_linux_C/so_example/genso
动态库在程序运行时是需要的。
可以查看程序执行时调用动态库的过程:
xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ ls -l
总用量 32
-rwxrwxr-x 1 xushixiong xushixiong 7721 12月 17 11:05 libmysum.so
-rwxrwxr-x 1 xushixiong xushixiong 8478 12月 17 11:07 main
-rw-rw-r-- 1 xushixiong xushixiong 82 12月 17 10:32 mysum.c
-rw-rw-r-- 1 xushixiong xushixiong 66 12月 17 10:24 mysum.h
-rw-rw-r-- 1 xushixiong xushixiong 247 12月 17 10:32 test_mysum.c
xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ ldd main
linux-vdso.so.1 => (0x00007fff0c513000)
libmysum.so => /workteam/xushixiong/data/remote_linux_C/so_example/genso/libmysum.so (0x00007f3f7fdb9000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3f7f9df000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3f7ffbd000)
xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ ldd libmysum.so
linux-vdso.so.1 => (0x00007fff109ff000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc03f646000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc03fc24000)