当前位置: 技术问答>linux和unix
用C++写动态库问题
来源: 互联网 发布时间:2015-12-19
本文导语: 从网上找了一个动态库示例程序,包含一个头文件datetime.h和两个源文件gettime.c,getdate.c,只是原来是.c的,生成动态库后能够正常调用,但我改成了.cpp后就不行了.请问为什么 头文件datetime.h定义了两个结构TIMETYPE和DATETYPE /* ...
从网上找了一个动态库示例程序,包含一个头文件datetime.h和两个源文件gettime.c,getdate.c,只是原来是.c的,生成动态库后能够正常调用,但我改成了.cpp后就不行了.请问为什么
头文件datetime.h定义了两个结构TIMETYPE和DATETYPE
/* 日期结构 */
typedef struct
{
int year;
int mon;
int day;
}DATETYPE;
/* 时间结构 */
typedef struct
{
char hour;
char min;
char sec;
}TIMETYPE;
/* gettime.cpp */
#include "time.h"
#include "datetime.h"
int gettime(TIMETYPE *t)
{
long ti;
struct tm *tm;
# makefile : 纵横软件制作中心雨亦奇编写, 2001-06-28.
time(&ti);
tm=localtime(&ti);
t->hour=tm->tm_hour;
t->min=tm->tm_min;
t->sec=tm->tm_sec;
}
/* getdate.cpp */
#include "time.h"
#include "datetime.h"
#include
int getdate(DATETYPE *d)
{
long ti;
struct tm *tm;
printf("xxn");
time(&ti);
tm=localtime(&ti);
d->year=tm->tm_year+1900;
d->mon=tm->tm_mon+1;
d->day=tm->tm_mday;
printf(" timen");
return 0;
}
makefile文件如下
# makefile : 纵横软件制作中心雨亦奇编写, 2001-06-28.
all : my.so
SRC = getdate.cpp gettime.cpp
TGT = $(SRC:.cpp=.o)
$(SRC) : datetime.h
@touch $@
%.o : %.cpp
g++ -c $?
# 动态函数库(my.so)生成
my.so : $(TGT)
cc -shared -o my.so $(TGT)
clean:
rm my.so $(TGT)
头文件datetime.h定义了两个结构TIMETYPE和DATETYPE
/* 日期结构 */
typedef struct
{
int year;
int mon;
int day;
}DATETYPE;
/* 时间结构 */
typedef struct
{
char hour;
char min;
char sec;
}TIMETYPE;
/* gettime.cpp */
#include "time.h"
#include "datetime.h"
int gettime(TIMETYPE *t)
{
long ti;
struct tm *tm;
# makefile : 纵横软件制作中心雨亦奇编写, 2001-06-28.
time(&ti);
tm=localtime(&ti);
t->hour=tm->tm_hour;
t->min=tm->tm_min;
t->sec=tm->tm_sec;
}
/* getdate.cpp */
#include "time.h"
#include "datetime.h"
#include
int getdate(DATETYPE *d)
{
long ti;
struct tm *tm;
printf("xxn");
time(&ti);
tm=localtime(&ti);
d->year=tm->tm_year+1900;
d->mon=tm->tm_mon+1;
d->day=tm->tm_mday;
printf(" timen");
return 0;
}
makefile文件如下
# makefile : 纵横软件制作中心雨亦奇编写, 2001-06-28.
all : my.so
SRC = getdate.cpp gettime.cpp
TGT = $(SRC:.cpp=.o)
$(SRC) : datetime.h
@touch $@
%.o : %.cpp
g++ -c $?
# 动态函数库(my.so)生成
my.so : $(TGT)
cc -shared -o my.so $(TGT)
clean:
rm my.so $(TGT)
|
将动态库中的getdate与gettime全部声明成extern "C"形式(函数定义时也要如此声明),在调用时也要进行这样的声明,可能是因为dlopen、dlsym仅支持C语言接口,而不支持C++接口
|
你的.o文件是用g++编绎成的,而链接成动态库的时候,用的是cc.
一般默认cc是gcc的软链,改成用g++看看吧.
一般默认cc是gcc的软链,改成用g++看看吧.
|
知道有unix编码和dos编码区别吗?
sco unix上还有个命令转换两种文件格式的。
sco unix上还有个命令转换两种文件格式的。
|
顶