免费注册 查看新帖 |

Chinaunix

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

C与C++混合编译出错! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-17 14:25 |只看该作者 |倒序浏览
我现在想在C中去引用C++的函数,所以得分别编译。

我的思路是,C文件用GCC编译,CPP文件用G++编译,之后再用GCC去链接这两个文件。

具体如下:

a.c是主函数main所在文件:
#include "my_net_transfer.h"

extern void my_net_transfer( void );

main()
{
        pthread_t id;

        pthread_mutex_lock( &mymutex );
        pthread_mutex_init( &mymutex, NULL );       
        pthread_create( &id, NULL, (void *)my_net_transfer, NULL );
                …… ……
        pthread_mutex_unlock( &mymutex );
}



my_net_transfer.h主要是被调用函数所在文件:

extern "C" void my_net_transfer( void );


my_net_transfer.cpp中
#include "a.h"

void my_net_transfer( void )
{
        pthread_mutex_lock( &mymutex );
                …… ……
        pthread_mutex_unlock( &mymutex );
}


Makefile(只用一个makefile,先编译CPP文件,再编译C文件)中
NETOBJ = my_net_transfer.o
NETSRC = my_net_transfer.cpp
CXX = bfin-linux-uclibc-g++

$(NETOBJ): $(NETSRC)
        $(CXX) $(CFLAGSNET) $(INCLD) -c $^

a$(EXESUF): a.o $(NETOBJ)
        $(CC) $(CFLAGS) $(LDFLAGS) $(INCLD) -o $@ $< $(EXTRALIBS) -lpthread -l$(LIB_NAME)



编译出错:
undefined reference to '_my_net_transfer'
collect2: ld returned 1 exit status

论坛徽章:
0
2 [报告]
发表于 2008-09-17 14:38 |只看该作者
都用g++编译应该就不会有问题了。
g++也可以编译.c

论坛徽章:
4
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11IT运维版块每日发帖之星
日期:2016-08-11 06:20:00IT运维版块每日发帖之星
日期:2016-08-15 06:20:00
3 [报告]
发表于 2008-09-17 14:39 |只看该作者

回复 #1 eNsEmpire 的帖子

通常是cpp调用c,反过来c也能调用cpp?我比较怀疑c可以调用cpp中的函数。

论坛徽章:
0
4 [报告]
发表于 2008-09-17 14:45 |只看该作者
用g++编译c以及cpp文件,最后再用g++来链接两个.o文件,这样应该没有问题。

论坛徽章:
0
5 [报告]
发表于 2008-09-17 14:59 |只看该作者
谢谢楼上的几位,

C调用C++的函数不行吗?

像我上面的那样写法理论上就不行吗?

论坛徽章:
0
6 [报告]
发表于 2008-09-17 15:08 |只看该作者

回复 #5 eNsEmpire 的帖子

C调用C++的函数当然是可以的啦。在最后链接的时候需要用g++。

在编译的时候,在C程序中如果你声明为void fun();则可以用GCC进行编译。
在编译的时候,在C程序中如果你声明为extern "C" void fun();则必须用G++进行编译。

你可以试试。

论坛徽章:
0
7 [报告]
发表于 2008-09-17 15:08 |只看该作者
g++和gcc在编译时,内部生成的函数名不相同, 才造成了连接错误,看看这里的讲述:
http://www.cppblog.com/converse/archive/2006/01/14/2733.html

论坛徽章:
0
8 [报告]
发表于 2008-09-17 15:10 |只看该作者
我用g++试了下,还是
undefined reference to '_my_net_transfer'
collect2: ld returned 1 exit status

C和C++混编是我上面哪里搞错了吗?

论坛徽章:
0
9 [报告]
发表于 2008-09-17 15:21 |只看该作者
原帖由 eNsEmpire 于 2008-9-17 15:10 发表
我用g++试了下,还是
undefined reference to '_my_net_transfer'
collect2: ld returned 1 exit status

C和C++混编是我上面哪里搞错了吗?


看看这个例子。

c.c

  1. #include <stdio.h>

  2. //extern "C" void fun(void) ;
  3. void fun(void);
  4. int main()
  5. {
  6.         printf("in main\n");
  7.         fun();
  8.         return 0;
  9. }

复制代码


d.cpp

  1. #include <iostream>
  2. using namespace std;
  3. extern "C" void fun(void);
  4. void fun(void)
  5. {
  6.         cout << "IN fun" << endl;
  7. }

复制代码


gcc -c c.c
g++ -c d.cpp
g++ c.o d.o -o out

论坛徽章:
0
10 [报告]
发表于 2008-09-17 15:30 |只看该作者

回复 #9 scutan 的帖子

我想你这个做法不是LZ想要的,因为你用g++编译实际上生成的是类C的中间文件.

LZ想要的是一个外部库,是g++编译的,而他想在一个C程序中使用这个外部库.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP