linux下cpp文件,linux下CPP文件调用C生成的动态连接库的编写与调用

看下面这个例子,其中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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值