关于linux动态链接库

        找工作之余,把apue上一个简单面向连接的socket程序写了下。上面用到别的章节的函数直接都用的extern,因为前天面试问我动态链接库了,就想这让用到的这些外部函数,直接动态链接。顺便学习下,怎么编译动态链接库的。没学习那么深,只是知道怎么制作,应用就好,可中间还是碰到了点小问题。

      要判断一个程序有没有动态链接库,可以用ldd命令,如果目标程序没有链接动态库,则打印“not a dynamic executable” (不是动态可执行文件)

      动态链接库的生成:gcc -shared -fpic -o dest.so sorce1.c sorce2.c source3.so生成所需的文件可以有另一个动态库。

      动态链接库的调用:gcc -g -o dest souce.c -L. -lsrc.so


我是在使用动态库时出现的错误,提示:error while loading shared libraries: libCrDyn.so: cannot open shared object

原因:因为在动态函数库使用时,会查找/usr/lib、/lib目录下的动态函数库,而此时我们生成的库不在里边。

这个时候有好几种方法可以让他成功运行:

(1)最直接最简单的方法就是把so拉到/usr/lib或/lib中去,但这好像有点污染环境吧?

(2)export LD_LIBRARY_PATH=$(pwd)

(3)可以在/etc/ld.so.conf文件里加入我们生成的库的目录,然后/sbin/ldconfig

对于方法2,我直接在生成可执行程序的脚本文件中导出:

#! /bin/sh

rm -f client

gcc -o client clinet_uptime.c -L/home/camel/sort/C/apue/16 -lCrDyn
export LD_LIBRARY_PATH=$(pwd)

自己的实例如下:

生成 .so的源文件:

#include "connect_retry.h"

int connect_retry(int sockfd, const struct sockaddr *addr, socklen_t alen)
{
	int nsec;

	for(nsec = 1; nsec <= MAXSLEEP; nsec <<= 1)
	{
		if(connect(sockfd, addr, alen) == 0)
			return 0;
		if(nsec<= MAXSLEEP/2)
			sleep(nsec);
	}
	return (-1);
}
引用的头文件

#ifndef CONNECT_RETRY_H
#define CONNECT_RETRY_H
#include <sys/socket.h>

#define		MAXSLEEP	128
int connect_retry(int sockfd, const struct sockaddr* addr, socklen_t len);

#endif
用到其中函数的源文件:

#include <sys/socket.h>
#include "connect_retry.h"
#include <netdb.h>
#include <arpa/inet.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

#define MAXADDRLEN	256
#define BUFLEN		128

//extern int connect_retry(int fd, const struct sockaddr *addr, socklen_t );






余下再给两个这方面的链接: http://blog.chinaunix.net/uid-20801390-id-3157134.html

http://pppboy.blog.163.com/blog/static/302037962011112104720934/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值