Program library 使用Linux共享函数库
这两天费了好多时间在生成和使用linux的共享函数库上,按照David Wheeler的文章"Program Library HOWTO"上面一个共享函数库的脚本例子,在fedaro 13上总是提示找不到函数库。
这个例子的任务是,写好函数文件libhello.c,libhello.h,主函数文件demo_use.c,把libhello.c生成共享函数库,用这个共享函数库和demo_use.c生成demo_use可执行文件。用shell脚本文件实现。
先写好三个函数
文件libhello.c:
#-------------------------------------------------------------#
/*filename:libhello.c*/
#include <stdio.h>
void hello(void)
{
printf("Hello,library world.\n");
}
#-------------------------------------------------------------#
文件libhello.h:
#-------------------------------------------------------------#
/*filename:libhello.h*/
void hello(void);
#-------------------------------------------------------------#
文件demo_use.c:
#-------------------------------------------------------------#
/*filename:demo_use.c*/
#include "libhello.h"
int main(void)
{
hello();
return 0;
}
#-------------------------------------------------------------#
我copy的第一个版本script_shared
#-------------------------------------------------------------#
#!bin/sh
#filename:script_shared
gcc -fPIC -Wall -g -c libhello.c
gcc -g -shared -W1,-soname,libhello.so.0 -o libhello.so.0.0 libhello.o -lc
/sbin/ldconfig -n .
ln -sf libhello.so.0 libhello.so
gcc -Wall -g -c demo_use.c -o demo_use.o
gcc -g -o demo_use demo_use.o -L. -lhello
./demo_use
#-------------------------------------------------------------#
运行后发现libhello.so.0没有,原来错在生成libhello.so.0这一句的gcc选项-Wl写成了-W1。此时对gcc -W1未能深究。
我的第二个版本script_shared
#-------------------------------------------------------------#
#!bin/sh
#filename:script_shared
gcc -fPIC -Wall -g -c libhello.c
gcc -g -shared -Wl,-soname,libhello.so.0 -o libhello.so.0.0 libhello.o -lc
/sbin/ldconfig -n .
ln -sf libhello.so.0 libhello.so
gcc -Wall -g -c demo_use.c -o demo_use.o
gcc -g -o demo_use demo_use.o -L. -lhello
./demo_use
#-------------------------------------------------------------#
运行后libhello.so.0,libhello.so的链接都是对的,但提示libhello.so.0找不到,重试了n遍,尝试libhello.so.0,libhello.so.0.0搬到/usr/local/lib/下,还是提示找不到函数库。此时对/sbin/ldconfig -n .这一句还是不太清楚作用,对整个流程没有从思路上去理一遍。
就这样费了一个下午之后,终于看到"./demo_use“前少写了一句设置环境变量LD_LABRARY_PATH的。
我的第三个版本script_shared
#-------------------------------------------------------------#
#!bin/sh
#filename:script_shared
gcc -fPIC -Wall -g -c libhello.c
gcc -g -shared -Wl,-soname,libhello.so.0 -o libhello.so.0.0 libhello.o -lc
/sbin/ldconfig -n .
ln -sf libhello.so.0 libhello.so
gcc -Wall -g -c demo_use.c -o demo_use.o
gcc -g -o demo_use demo_use.o -L. -lhello
using LD_LABRARY_PATH.LD_LABRARY_PATH="."
./demo_use
#-------------------------------------------------------------#