我理解中,.so文件就相当于windows下的.dll文件。 环境不一样,感觉就不一样。 windows下的.dll文件虽然做了好些,但是怎么用makefile写还是不怎么了解。到了linux下更是完全扯着蛋了。
随便写了个so文件的sample。如有误,看官请指出。
tomato.c生成动态链接库.
C++
#include <string.h>
#include <stdio.h>
int tomato(char *str)
{
printf("[so] : tomato called ~ \n");
sprintf(str,"writen by tomato \n");
return 1;
}test.c调用tomato.c中tomato方法
C++
#include <stdio.h>
int main()
{
char aa[200];
printf("[call tomato] : %d\n",tomato(aa));
printf("[result] : %s \n",aa);
return 0;
}写个makefile来生成文件.
Bash
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输出如下:
Bash
[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中的内容.一般情况是不太会这么做的.一个很重要的是,头文件.我们会写一个头文件如下
C
#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中都加一句
C
#include "tomato.h"这样就可以保证接口没问题,消除warning了.
Comments
No comments yet — be the first to write one.