linux下动态链接库的做法

我理解中，.so文件就相当于windows下的.dll文件。环境不一样，感觉就不一样。 windows下的.dll文件虽然做了好些，但是怎么用makefile写还是不怎么了解。到了linux下更是完全扯着蛋了。

随便写了个so文件的sample。如有误，看官请指出。

tomato.c生成动态链接库.

#include
#include

int tomato(char *str)
{
printf("[so] : tomato called ~ \n");
sprintf(str,"writen by tomato \n");
return 1;
}

test.c调用tomato.c中tomato方法

#include
int main()
{
char aa[200];
printf("[call tomato] : %d\n",tomato(aa));
printf("[result] : %s \n",aa);
return 0;
}

写个makefile来生成文件.

CC := gcc
CFLAGS := -Wall #-std=c99
SHARED := -shared -fPIC
FRUITLIB := `pwd` -lfruit
LIBS := -L
LIBS += ${FRUITLIB}

TSTOBJ := test.o

PROGS := libfruit.so test

#---------------------------------------------------------------------

.PHONY : all rebuild clean run
all : ${PROGS} succ

rebuild : clean all

test : ${TSTOBJ}
${CC} ${CFLAGS} -o $@ ${TSTOBJ} ${LIBS}

#test.o : libfruit.so
# ${CC} ${CFLAGS} -o $@ test.c ${LIBS}

libfruit.so : ${FROBJ}
${CC} ${CFLAGS} -o $@ tomato.c ${SHARED}

run : test
@echo "have a show :"
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. ./test

succ :
@echo "Complete !"

clean :
-rm -f ${PROGS} ${TSTOBJ} ${FROBJ}
-rm -f *~
-rm -f *.swp

输出如下:

[yu@argcv-com fruit]$ make clean
rm -f libfruit.so test test.o
rm -f *~
rm -f *.swp
[yu@argcandargv-com fruit]$ make
gcc -Wall -o libfruit.so tomato.c -shared -fPIC
gcc -Wall -c -o test.o test.c
test.c: In function ‘main’:
test.c:5:2: warning: implicit declaration of function ‘tomato’ [-Wimplicit-function-declaration]
gcc -Wall -o test test.o -L `pwd` -lfruit
Complete !
[yu@argcandargv-com fruit]$ make run
have a show :
LD_LIBRARY_PATH=. ./test
[so] : tomato called ~
[call tomato] : 1
[result] : writen by tomato

“implicit declaration of function” ? 参考 这篇.

注意,本文只是强行介绍了一下怎么调用.so中的内容.一般情况是不太会这么做的.一个很重要的是,头文件.我们会写一个头文件如下

#ifndef TOMATO_H
#define TOMATO_H

#ifdef __cplusplus
extern "C" {
#endif // __cplusplus

int tomato(char *str);

#ifdef __cplusplus
}
#endif // __cplusplus

#endif // TOMATO_H

然后tomato.c和test.c中都加一句

#include "tomato.h"

这样就可以保证接口没问题,消除warning了.