- 论坛徽章:
- 0
|
10可用积分
我在linux下写了一个C的api函数库,和其他一些函数库一起编译成了静态库, 别人的程序是用C++写的程序, 要用到我的C函数库, 请问在C函数库改动量不大的情况下如何让C++程序正常使用C的API,
代码如下,恳请高手指点,请仔细说明下,急用,谢谢了
我在用#if _cplusplus extern "c"....将整个头文件包住了,编译也通过了,但一使用apiTest对象的方法就会出现段错误的情况,这些api我之前都是用C程序调用的,都没问题,况且我在init这个api中一开始就打印了一个调试语句,现在没有打印信息出现而是直接出段错误了,不知道是不是链接的问题,还是main程序写错了,我的Makefile如下:
2 CXX=mipsel-linux-g++
4 LD=mipsel-linux-g++
6 LDFLAGS=-I./ -I/usr/local/toolchain_mipsel/include -L/usr/local/toolchain_mipsel/lib -lpthread
7 CFLAGS=-DPLATFORM_LINUX -DLITTLE_ENDIAN -lpthread -Wall -O2
8
9 all: realtek_test
10
12 OBJS = api.o
14 LIBS = libapi.a libsqlite3.a libregisterdevice.a
15
16 realtek_test: $(OBJS)
17 $(LD) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)
21
22 api.o: api.cpp
23 $(CXX) -I./ -DPLATFORM_LINUX -DLITTLE_ENDIAN -lpthread -I/usr/local/toolchain_mipsel/include -c $< -o $@
24
25 clean:
26 rm -f *.o
段错误的问题解决了,之所以会出现段错误是因为类的方法名和api函数名相同所导致的,但这是编译的问题还是链接的问题就不确定,大家有知道情况的请指点下,谢谢大家了
api.h:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <assert.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <pthread.h>
#include <malloc.h>
#include <signal.h>
#include "RegisterDevice.h"
#include "Api.h"
#ifndef SUCCESS
#define SUCCESS 0
#endif
#ifndef FAILED
#define FAILED -1
#endif
#ifndef MAX_CMD_LEN
#define MAX_CMD_LEN 60
#endif
#ifndef MAX_BUF_LEN
#define MAX_BUF_LEN 60
#endif
#ifndef DEFAULT_ARGS
#define DEFAULT_ARGS 5
#endif
extern int set_devname(const char *devname);
extern int ushare(const char *sharename);
extern int share(const char *sharename, const char *path);
extern int smb_startup(void);
extern int smb_stop(void);
extern int quit(void);
extern int init(const char *dev_id, const char *dev_name, const char *desc, const char *dev_type, const char *database_path);
class apiTest
{
public:
int share(const char *sharename, const char *path);
int ushare(const char *sharename);
int smbUp(void);
int smbDown(void);
int setDevName(const char *DevName);
int init(const char *DevId, const char *DevName, const char *Desc, const char *DevType, const char *Database);
int quit(void);
};
int apiTest::share(const char *sharename, const char *local)
{
share(sharename, local);
}
int apiTest::ushare(const char *sharename)
{
ushare(sharename);
}
int apiTest::smbUp(void)
{
//smb_startup();
}
int apiTest::smbDown(void)
{
//smb_stop();
}
int apiTest::setDevName(const char *devname)
{
//set_devname(devname);
}
int apiTest::quit(void)
{
quit();
}
int apiTest::init(const char *DevId, const char *DevName, const char *Desc, const char *DevType, const char *Database)
{
init(DevId, DevName, Desc, DevType, Database);
}
api.cpp:
#include "api.h"
char *dev_id = "DeviceeviceId:00000000-0000-FFFF-FFFF-FFFFFFFFFFFF",
*dev_name = "box",
*desc = "samba-box",
*dev_type = "DeviceeviceId:box",
*database_path = "/tmp/cool.db";
int main(int argc, char *argv[])
{
if (argc < 2)
{
printf("database_path\n"
return -1;
}
apiTest test;
test.init(dev_id, dev_name, desc, dev_type, database_path);
while (getchar() != 'q')
{
;
}
test.quit();
}
[ 本帖最后由 nikshuang 于 2009-9-26 10:10 编辑 ] |
|