关于编译指定库路径与程序运行指定库路径很多初学者理解有误,现通过下面的例子来更直观的说明问题
主程序
#include <stdio.h>
#include "add.h"
int main()
{
int a = 10;
int b = 10;
printf("%d\n",add(a,b));
}
libadd.so的内容
#include "add.h"
int add(int m,int n)
{
int s = m + n;
return s;
}
目录内容
验证开始
jai@jbai:~/桌面/libpathtest$ gcc -c -fPIC add.c
jai@jai:~/桌面/libpathtest$ gcc -shared -fPIC -o libadd.so add.o
jai@jai:~/桌面/libpathtest$ gcc -o add main.c
/tmp/ccDommGK.o:在函数‘main’中:
main.c:(.text+0x21):对‘add’未定义的引用
collect2: error: ld returned 1 exit status
jai@jai:~/桌面/libpathtest$ gcc -o add main.c -ladd
/usr/bin/ld: 找不到 -ladd
collect2: error: ld returned 1 exit status
jai@jai:~/桌面/libpathtest$ gcc -o add main.c -L$(pwd) -ladd
jai@jai:~/桌面/libpathtest$ ./add
./add: error while loading shared libraries: libadd.so: cannot open shared object file: No such file or directory
jai@jai:~/桌面/libpathtest$ export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$pwd"
jai@jai:~/桌面/libpathtest$ ./add
20
jai@jai:~/桌面/libpathtest$
可以看到在编译的时候已经指定了库的路径,程序编译完成
第一次在运行可执行文件时,提示错误:找不到libadd.so(在默认路径/lib、/usr/lib)
第二次运行前,执行了export LD_LIBRARY_PATH=“
L
D
L
I
B
R
A
R
Y
P
A
T
H
:
LD_LIBRARY_PATH:
LDLIBRARYPATH:pwd”
运行程序正常。
经过此例说明编译程序时加入的库路径,并不是意味着把路径参数也编译进去后,可以直接运行可执行文件,事实是执行程序时仍需要指定库的路径(当然可以采用静态编译,这样可以直接执行),这是很多初学者容易犯的错,切记。