编译指定库路径与程序运行指定库路径的异同

关于编译指定库路径与程序运行指定库路径很多初学者理解有误,现通过下面的例子来更直观的说明问题

主程序

#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”
运行程序正常。

经过此例说明编译程序时加入的库路径,并不是意味着把路径参数也编译进去后,可以直接运行可执行文件,事实是执行程序时仍需要指定库的路径(当然可以采用静态编译,这样可以直接执行),这是很多初学者容易犯的错,切记。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值