C中调用C++的函数问题。。。

tsrs 2005-12-30 01:35:37
小弟近日用C编程,其中的数据采集卡控制需要使用一些人家提供的lib文件,前边用提供的示例程序代码可以正常编译、连接通过并正常运行,昨天和我自己的程序连起来后发现连接时出现“undefined symbol……”,出现的这些都是 lib 中提供的函数,后来我将采集卡带的示例程序后缀名由 cpp 改成 c ,发现同样是编译时没问题,但连接时也提示“undefined symbol……”,改回cpp后又能正常连接,我晕死了。。。

请问如果要在 C 程序中调用 C++ 的函数应该注意些什么呀?

我用的是(几次使用的都是一样的设置)
BC3.1
large模式

lib文件已经tlib到cl.lib中。
...全文
687 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
fierygnu 2005-12-31
  • 打赏
  • 举报
回复
C++编译器要对函数名进行mangle处理,但mangle没有标准,各编译器自行其是。所以不要说C编译器无法连接C++编译器生成的库,不同的C++编译器也会有这个问题的。
tsrs 2005-12-30
  • 打赏
  • 举报
回复
实在不行就只能全换成CPP文件或者找厂商要支持C的库了。
tsrs 2005-12-30
  • 打赏
  • 举报
回复
谢谢各位的解答,可能是我没表达清楚,我用的是BC3.1,貌似是可以编译C++代码的吧。当然也可以编译C的了。
我拿不到源代码:(如果我有库的源代码的话问题也好解决了,因为我相信它那库的源代码是符合C标准的,应该只是编译时用的C++编译器。
如cky41(有点魄力) 所说,我想问题应该在于函数名,用C编译的代码函数名和库中用CPP格式编译的函数名不相同。但找不到合适的方法来调用。
herryhuang 2005-12-30
  • 打赏
  • 举报
回复
如果编译器不支持C++特性,那就没办法使用C++的库。

有两个办法,第一是使用C++编译器,第二(如果你有这个库的源代码,并且这个库没有使用C++的什么特性)使用C编译器重新编译库。

tsrs 2005-12-30
  • 打赏
  • 举报
回复
to: cky41(有点魄力)
谢谢,我发贴后也搜过一些,现在继续,呵呵……

to: dragonzxh(河马MiaMia~小雨特批C++非技术区技术灌水员~)
我代码是符合C标准的。
并且例子代码最开始也是用C写的,并且我用C写的测试代码一样会出问题。呵呵……
因为在文件开头的注释说明中很清楚的写着文件名为.c,估计也是用的人家的,只是把lib的代码用C++编译器编译了一遍而已。哎……

/*;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; File Name : AD_DEMO1.C ;;
;; Purpose : Demo program of using AD softtrig and program ;;
;; data transfering ;;
;; Date : 8/8/1995 ;;
;; Revision : 1.1 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;*/
windyloft 2005-12-30
  • 打赏
  • 举报
回复
把编译器换成c++的就可以了。
c编译器不能编辑C++代码
屋顶上的老猫 2005-12-30
  • 打赏
  • 举报
回复
由于编译器机理上存在部分质的不同,C是调用不了C++函数的。相反,C++可以通过extern "C"来使用C,那也是因为C++编译器的发展是在C的基础上而来的!
dragonzxh 2005-12-30
  • 打赏
  • 举报
回复
没听说C编译器能兼容C++代码吧....
换C++编译器写C代码倒是可以的
全部extern "C"好了~
iwantfat 2005-12-30
  • 打赏
  • 举报
回复
我也遇到过楼主这个问题,
这是编译器在作怪
通常对于c编译器,编译过程中,有函数的名字就ok了,
而对与c++编译器来说,光有函数名字是不够,原因很好解释,因为c++中光有函数名字还不能确定函数的调用,c++中函数重载 ,就是一个很好的说明。所以c++编译器,在 编译的时候不光要函数的名字,还要函数的参数;
-----------------
人家的lib是针对c的,你用cpp的编译器,当然了就会产生那种错误。
如果楼主有兴趣,可以将那些lib文件用二进制的方式打开,那里面会找到一些你所用到的函数的名字。解决这个问题最好办法,就是写c程序,或者将他们的实现再进行封装
csucdl 2005-12-30
  • 打赏
  • 举报
回复
估计有问题,c调用c++的库函数
在c++中调用c库函数倒是可以用extern "C"来解决, 这种向下兼容倒是没见过
piaochen_2002 2005-12-30
  • 打赏
  • 举报
回复
看看是不是extern "C"的问题
tb01412 2005-12-30
  • 打赏
  • 举报
回复
在LINUX下:
试一下将C++程序编译成.o文件之后,再用nm导出函数接口,然后在C代码中用extern XXX(int a,int b);然后在代码中使用这个函数,不晓得能通过不??
其中XXX为nm查看到的名称。int a,int b参数代表C++中相应的函数接口
注意,C文件与C++文件分开编译,然后再将c++编译后的文件形成库,最后才一起链接
gougou8180 2005-12-30
  • 打赏
  • 举报
回复
在c++文件中 声明extern c
屋顶上的老猫 2005-12-30
  • 打赏
  • 举报
回复
呃,这里有个 问题要说明:

不是说 C 编译器可以 编译C++程序,
只是通过一些接口,一些独特的方式,比如 DLL
来调用 C++ 中的一些功能模块 ~
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
小虫这句补的好!
jixingzhong 2005-12-30
  • 打赏
  • 举报
回复
呃,这里有个 问题要说明:

不是说 C 编译器可以 编译C++程序,
只是通过一些接口,一些独特的方式,比如 DLL
来调用 C++ 中的一些功能模块 ~
jixingzhong 2005-12-30
  • 打赏
  • 举报
回复
由于 C 在 C++ 之前出现,
之后的C++自然的 兼容了 C ,
在 C++ 中调用 C 是在 C++ 标准中有相关标准支持的 。

但是,C 没有提供这个 后向兼容性,
不能直接调用 C++ 。

所以,解决的 办法就是,
在 封装的 C++ 中,提供一个 C 能够支持的 接口,
通过这个接口来 调用 C++ 函数 ...

关于实际的 操作,楼主可以在 CSDN 中找到相关的 实现方式。
---------
以前曾经保存了这个文件的 ,但是 ...
玩 LINUX 时候,
不小心把机器 玩 崩溃了 ...
所有的 东西都 OVER ...
jixingzhong 2005-12-30
  • 打赏
  • 举报
回复
在 C 部分的 調用過程和普通的 調用 完全和 一般的 調用一樣 !

關鍵是 妳封裝的那個 C++ 的DLL!!
在 DLL 要提供一個 C 的接口,
就能夠實現這個調用嘞!!
jixingzhong 2005-12-30
  • 打赏
  • 举报
回复
C 是可以調用 C++ 函數的 !!
yiliao 2005-12-30
  • 打赏
  • 举报
回复
关注……
cky41 2005-12-30
  • 打赏
  • 举报
回复
c++的库编译后的函数符号名全是c++风格的,
而你的c程序编译后的函数符号是c风格的。

比如你的c程序需要c++库中的这样一个函数foo
你的c程序编译后的目标文件中(.o文件),还是需要符号名为foo的函数

但是c++库中的这个函数名不是单纯的foo,而是可能类似VZfooV之类的函数名,这样主要是为了重载。

所以你必须将你c中的这个函数也改名为VZfooV的名称,或者在生成c++库的源码中使用extern "C"的修饰导出的函数,或者干脆你使用c++程序来使用这个库。

关于extern "C"的问题也就是你这个问题的关键,google一下吧
加载更多回复(2)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧