LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1175|回复: 6

俺同时编译.c和.cpp时遇到2个问题,不知如何解决?

[复制链接]
发表于 2006-7-14 16:47:21 | 显示全部楼层 |阅读模式
小弟的问题是这样的:
俺的 cpp 程序要用到 amr 编解码的 c 代码,于是俺想出两个方案:
1. 用g++来编译 cpp 和 c 代码:
但是这个导致的问题是,g++检查过于严格,使得原本用gcc编译一个错都没有的 c 代码,报了很多类型转换的错误。
不知道g++能否调整检查的严格程度?? 俺查了manual,但是没查到。

2. 用gcc编译 c 代码, 用 g++ 编译 cpp 代码, 最后链接:
俺试过这个方案,俺的做法是将 c 代码,编译成 .o 或 .a,然后用g++编译和链接,比如:
g++ main.cpp  libamr.o   或者
g++ main.cpp  amr.o  ,
这样最后报错,是ld的链接错:
  “对‘xx()’未定义的引用collect2: ld 返回 1”
俺不明白,为什么g++无法和gcc生成的目标相链接? 我想是我哪儿弄错了,因为gnu的c库是能够被g++然后调用ld来链接的。但还找不到原因。

因为上面两个方案的都没成,俺算是歇着了:confused: ,不知道前辈们是怎么做的呢?
发表于 2006-7-14 19:29:35 | 显示全部楼层
http://geneura.ugr.es/~jmerelo/c++-faq/mixing-c-and-cpp.html
第一个问题的答案是,c和c++的语法不一样... c++并不是c的一个超集.
  1. // C++ 代码

  2. extern "C" {
  3.    // Get declaration for f(int i, char c, float x)
  4.    #include "my-C-code.h"
  5. }

  6. int main()
  7. {
  8.    f(7, 'x', 3.14);   // Note: nothing unusual in the call
  9.    ...
  10. }
复制代码

用gcc编译libamr 用g++编译main.cc 最后用g++链接.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-7-15 01:25:56 | 显示全部楼层
谢谢仁兄,小弟明白了!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-7-15 15:15:48 | 显示全部楼层
突然有一个问题想不明白,我看了/usr/include/stdio.h 等头文件,里面并没有 extern "C" 啊,为什么C++就能够直接包含 stdio.h 进来用呢?
是不是 stdio 库里面即含有c style的 name 也含有mangled name呢,就是说 gnu 的 c 库是由 gcc 编译的 .o  和 g++ 编译的 .o 的一个合集?
回复 支持 反对

使用道具 举报

发表于 2006-7-15 22:56:01 | 显示全部楼层
可能是为了兼容老的标准,按新的标准应该写成: #include <cstdio>
mangled name是什么意思啊?
也许 cstdio里的东西...跟c语言里stdio.h不大一样.. (我猜的)  ;)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-7-15 23:03:21 | 显示全部楼层
资料上说mangled name是c++的对函数名的命名,和c不同,所以使得相互链接要考extern "C"来帮助。
仁兄意思是说,#include <stdio.h>实际上是包含的<cstdio> ?
回复 支持 反对

使用道具 举报

发表于 2006-7-19 14:23:53 | 显示全部楼层
看了一下stl的源码.. 感觉很诡异... 现在不想深究这个.. 偶stl的书还没看完呢  
源码里好像是cstdio包含stdio.h  -_-#
/usr/include/c++/3.3/cstdio
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表