我理解中,.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了.