看下面这个例子,其中add函数是用c编写的代码,而主函数是用c++编写的代码,将c代码编译成动态库,然后用c++调用。
add.h
#ifndef ADD_FILE_HEADER_INC
#define ADD_FILE_HEADER_INC
#include
#include
extern double
add (double a, double b);
#endif
add.c
#include "add.h"
double
add (double a, double b){
return a+b;
}
main.cxx
extern "C"
{
#include "add.h"
}
int
main()
{
double a=5.2, b=65.47;
double c=add(a,b);
printf("%lf\n", c);
return 0;
}
用于编译的makefile如下:
makefile
main:main.o add.so
g++ -o main main.o ./add.so -g
add.so:add.c
gcc -fpic -shared -g -o add.so add.c -I ./
main.o:main.cxx
gcc -c main.cxx -I ./
clean:
rm *.so *.o main
需要注意的是,在生成可执行文件时,用的编译命令为g++, 而不是gcc,如果用gcc编译将出现如下错误:
umain.o:(.eh_frame+0x11): ndefined reference to `__gxx_personality_v0'
最后,因为自己的代码量太大了,所以就写了个makefile,如下:
CC=gcc
GG=g++
CFLAG=-o
CFLAGS=-fpic -shared -g -o #编译动态库的选项
PARAM=-Wall #警告
CUR=$(shell pwd)
SRC=$(CUR)/src
CPP=$(SRC)/*.cpp
SRCS=$(SRC)/*.c
REP=$(SRC)/rep_game/*.c #src目录下的rep_game文件夹下的所有.C文件
CODE=$(SRC)/game_code/*.c #src目录下的game_code文件夹下的所有.C文件
LIB=$(CUR)/lib/playlib.so
TARGET=$(CUR)/bin/exe
.PHONY:$(TARGET)
all:$(TARGET)
$(TARGET):$(CPP) $(LIB) #编译目标文件exe
$(GG) $^ $(CFLAGS) $@ -g
$(LIB):$(SRCS) $(REP) $(CODE) #编译出动态库
$(CC) $^ $(CFLAGS) $@ -L ./#$(PARAM)
clean:
@-rm -rf $(TARGET)
@-rm -rf $(LIB)
@-rm -rf $(CUR)/include/*~
@-rm -rf $(SRC)/*~
@-rm -rf $(CUR)/*~
create:
@-mkdir src/
@-mkdir include/
@-mkdir bin/
@-mkdir lib/
# @-cp /root/xiongzixin/file_example/src/memory.c src/
# @-cp /root/xiongzixin/file_example/include/memory.h include/