免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4634 | 回复: 4
打印 上一主题 下一主题

[C] 请教,C语言编写的目标代码如何能与C++静态库正确链接 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-17 20:05 |只看该作者 |倒序浏览
5可用积分
在linux平台上,因为多方面原因,不得已有如此要求,大家见谅。
C语言编写的目标代码要调用静态库的函数,假设可以更改静态库的的makefile,但源文件后缀依旧为cpp。
有没有办法去掉cpp函数的修饰,使得c目标代码可以与其正常链接,调用。

很着急,请帮忙出出主意。
不胜感激!

最佳答案

查看完整内容

用gcc或者g++以C的语法去编译*.cpp 文件是可以的。gcc -xc 1212.cppg++ -xc 326.cppC++库, 如果导出的时候, 没有使用 extern "C"—— 也就是你说的去掉cpp修饰的意思吧?C应该是无法链接到该库的。所以, 如果源代码中没有使用, 源代码是必须修改的。但是修改了也不一定有用, 如果那个库本来就没打算供C使用, 比如它提供的本来就是C++类, 就很麻烦了。要自己做一个工作 …… 比如它提供了 :class C {public void f1();publ ...

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
2 [报告]
发表于 2009-04-17 20:05 |只看该作者
用gcc或者g++以C的语法去编译*.cpp 文件是可以的。
gcc -xc 1212.cpp
g++ -xc 326.cpp


C++库, 如果导出的时候, 没有使用 extern "C"—— 也就是你说的去掉cpp修饰的意思吧?
C应该是无法链接到该库的。
所以, 如果源代码中没有使用, 源代码是必须修改的。


但是修改了也不一定有用, 如果那个库本来就没打算供C使用, 比如它提供的本来就是C++类, 就很麻烦了。

要自己做一个工作 ……  比如它提供了 :
class C {
public void f1();
public int f2();
public double f3(float);
};

那么你要

---- C_wrap.h ---
struct C_wrap;
struct C_wrap* C_create(void);
void C_dispose(struct C_wrap* c);
void C_f1(struct C_wrap* c);
int C_f2(struct C_wrap* c);
double C_f3(struct C_wrap* c, float );


---- C_wrap.cpp ---

extern "C" struct C_wrap* C_create(void) {
  return (C_wrap*) new C;
}
extern "C"void C_dispose(struct C_wrap* c) {
   delete (C_wrap*) c;
}

extern "C" void C_f1(struct C_wrap* c) {
    return ((C_wrap*)c)->f1();
}
extern "C" int C_f2(struct C_wrap* c) {
    return ((C_wrap*)c)->f2();
}

double C_f3(struct C_wrap* c, float f) {
    return ((C_wrap*)c)->f3(f);
}

也许还需要拷贝和赋值工作。


这样, 不改库的源代码, 只是把它的功能, 转化成C接口。
然后C使用 C_wrap.h

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之水原三星
日期:2015-06-02 16:34:202015年亚冠纪念徽章
日期:2015-10-19 18:13:37程序设计版块每日发帖之星
日期:2015-11-08 06:20:00
3 [报告]
发表于 2009-04-17 20:07 |只看该作者
不太清楚,我都是用g++编译.c的(语法检查严格一些).
你试试用g++编译,连接他们呢.
Good luck

论坛徽章:
0
4 [报告]
发表于 2009-04-17 20:36 |只看该作者
谢谢回复,
但是c语言目标代码只能用gcc编译,因为要作为xorg的一个extension. 呵呵。

论坛徽章:
0
5 [报告]
发表于 2009-04-17 22:50 |只看该作者
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP