当前位置:  技术问答>linux和unix

为什么同样的代码,链接同样的库,c成功链接,c++的会失败??

    来源: 互联网  发布时间:2015-07-13

    本文导语:  同样的程序,同样的路径配置. 用gcc编译链接正常.用g++编译能通过,链接时报错:找不到库函数. 程序非常简单,用到了oracle7的接口 int main() {         Lda_Def lda;         ocom(&lda); } 用g++编译时,编译可以通过(说明...

同样的程序,同样的路径配置.
用gcc编译链接正常.用g++编译能通过,链接时报错:找不到库函数.

程序非常简单,用到了oracle7的接口
int main()
{
        Lda_Def lda;
        ocom(&lda);
}

用g++编译时,编译可以通过(说明头文件里面找到了正确的ocom定义).
但链接不到(.so肯定是存在的,应该用gcc丝毫没有问题).

以我自己的理解,如果库函数的头文件里对c/c++区分,比如:
#ifdef C    
ocom();
#endif
那么用g++编译时,#ifdef中的ocom定义会跳过,头文件中找不到正确的定义,
那么错误应该发生在编译这一步.

可是错误发生在链接.想不通阿.

g++链接时错误如下:
Undefined                       first referenced
 symbol                             in file
ocom(cda_def*)                      /var/tmp//cc04hY6i.o
ld: fatal: Symbol referencing errors. No output written to a.out

|
c++的函数跟c函数看起来一样,但实际是不一样的,编译器会在C++函数名称里自动加上参数类型信息而C不会加,所以C程序去连接C++程序就会找不到这个函数。
extern "C" 就是告诉C++编译器,这个函数按照C的方式产生函数名称,这样就可以让C程序正确找到了。

|
C++与C生成的代码,命名方式是不同的。
比如你在C和C++下都定义了一个函数myfunc
那么C编译以后的函数名仍然是myfunc
但是C++编译以后的函数名是_7UXmyfunc(我只是举个例子,现实中可能前缀不是_7UX,反正有一串前缀)。它的作用主要是为了区别C++中的函数重载,因为可能有两个以上的myfunc函数,只是参数列表不同,而前边的前缀就是来区别函数列表的。
连接的时候,两种命名方式是不一样的,因此连接程序就无法连接了。
上边给你的建议,也不能对函数重载,否则不能以C的方式编译并连接了。
不知道你明白了没有。

|
(1)连接器报的错是给程序员看的,如果程序员对C++编译命名规则不清除,他就不会知道
哪个"_7uxfunc"是个什么东东, 所以应该报"func"
(2)你是加了extern "C"后才联接通过的吧?如果是这样,那问题好像又回到了你问题的出发点.
(3)这个问题不是很清除.但是如果c++要调用c的库时,肯定都应该加上extern "C".

|
C++对标识符名字做了mangle导致。mangle的方法没有标准,不同的编译器方法不同,所以CC和g++不能互相调用。
找Inside C++ OBject modle看看。

|
这个问题已经很清楚了吧.
这些都是编译器的问题,并不要去深究,
有空可以去看看lib,obj,PE,文件的格式,不同的操作系统,不同的加载器都会不同的
 lippman 的 inside c++ object module,讲了一些编译器对C++语言的实现

打开那些二进制库文件看看

|
c++里面调用c函数的时候,使用extern "C"告诉c++编译器要调用c函数了。
你可以看看stdio.h等这些ANSI头文件里面都用extern"C"来包含了函数 ,所以在c++里面调用这些函数的时候就不会出现连接错误,而你自己用c写的函数,如果头文件里面没有extern,在c++里面也没有extern,就会出现连接错误的问题,就是这个原因。

    
 
 

您可能感兴趣的文章:

  • jquery代码-在弹出窗口中打开链接和在选项卡中打开链接
  • 关于代码模块链接的问题
  • jquery动态设置超链接显示内容的实现代码
  • 谁知道linux/unix下利用Schema读取校验xml的开源代码,给一个链接,谢谢!
  • 源代码有.c和.cpp,链接时出错
  • JQuery选择超链接的代码一例
  • 提供些下载linux C 编程 原代码的 下载 链接吧?
  • 创建 sql server 链接服务器的sql代码
  • 代码从一台32位机上移到另一台32位机上时发生链接错误
  • Jquery模拟超链接点击效果的代码示例
  • jquery修改a标签中href超链接的实现代码
  • PHP实现删除非站内外部链接实例代码
  • jquery超链接与图片提示效果的实现代码
  • jquery捕获超链接事件并局部刷新的代码一例
  • 怎样用script实现某段html随滚动条滚动的效果?最好能给源代码?或者给出能看到源代码的链接也可以
  • 用javascript来控制 链接的target 属性的代码
  • jquery自动打开第一个超链接的实现代码
  • jQuery屏蔽页面所有超链接及隐藏状态栏网址的代码
  • 自动为文章关键字添加链接的C#代码
  • python正则匹配抓取豆瓣电影链接和评论代码分享
  • 谁升级过rpm程序本身?我升级失败,现在只能通过源代码方式升级了~~~
  • 命令行中成功 ,脚本中失败的代码
  • 关于system执行失败的问题。比较怪,内附代码!100分赠送!up有分
  • 在vc下可以编译通过的C++代码,可是拿到gcc下去编就失败
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • javascript 添加到收藏夹和书签代码示例
  • 在JBuilder中,为什么编写的代码中,当代码出现关键字时,后面的部分代码就移位了,当在有关键字的那些代码行进行选择时,也会出现鼠标位
  • Python GUI编程:tkinter实现一个窗口并居中代码
  • 为什么两行代码间不加入其他代码就崩溃,而加入了日志代码后就不崩溃?
  • JSP中清空cookie代码参考
  • 在ubuntu8.10 新立得中安装anjuta,为什么没有代码提示功能,怎么做才有,还有自动代码补全和代码提示有什么区别,
  • Python获取网页编码的方法及示例代码
  • 到底怎么样的代码算是有效代码?请教了。。
  • HTML网页中的html body onload自动跳转方法介绍及自动跳转代码示例
  • 如果要研究源代码以提高自己,哪一个开放源代码的软件比较合适?
  • php通过socket_bind()设置IP地址代码示例
  • linux源代码的时间函数源代码
  • boost库lexical_cast不同用法代码参考
  • gdb的时候代码 next显示的代码乱了
  • 通过javascript库JQuery实现页面跳转功能代码
  • 源代码!源代码!
  • 使用libpcap读取tcpdump抓取的文件并解析c代码实例
  • 哪位会使用代码保护工具WingGuard来保护java代码?
  • HTML网页的Meta Refresh自动跳转方法介绍及Meta Refresh自动跳转代码示例
  • 如何得到C语言代码对应的汇编代码?
  • Linux c++虚函数(virtual function)简单用法示例代码
  • RedHat Linux是开放源代码的吗?如何能看见它的源代码,如何进行修改?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3