LinuxSir.cn,穿越时空的Linuxsir!

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

主程序为.cpp文件,调用一个.c文件的函数,连接时告诉undefined reference to hashlist_

[复制链接]
发表于 2005-1-9 13:45:01 | 显示全部楼层 |阅读模式
我的主程序为.cpp文件,调用一个.c文件的函数,编译通过,连接时告诉undefined reference to hashlist_get,这个函数在.c中定义,请教如何解决?
.cpp 和.c文件都是用gcc编译分别编译的,最后将两个.o文件连接时出现上述错误的。
我曾经尝试过把那个.c文件命名为.cpp文件,结果编译这个文件的时候就出错了。
我用的是linux fedora 1,gcc版本3.3.2。
还请大虾们帮我看看这个问题该如何解决,不胜感谢!!
发表于 2005-1-9 14:31:27 | 显示全部楼层
是不是没有用extern "C"?
 楼主| 发表于 2005-1-9 22:17:49 | 显示全部楼层
谢谢这位大虾,我是没加extern "C",问题就在此,现在知道怎么回事了!
我在包含.c头文件的时候用了extern "C"{},结果就没问题了。
现在我还有一个问题不是太明白,还望高人指点。
extern "C"声明是在.cpp里用c函数的时候加上,还是在.c程序中定义该函数的时候在之前加。
两种办法我都试过了,结果编译都有问题,现在很是迷惑,查了不少资料,也没搞明白。
还请达人指点迷津啊!

再次感谢这位大虾!
发表于 2005-1-10 09:25:45 | 显示全部楼层
在cpp里声明函数原形的时候用
发表于 2005-1-10 10:47:22 | 显示全部楼层
由于c++支持重载,所以c++程序在编译时,对名字的处理和C 语言是不一样的。这就导致连接时无法解析所需要的符号。加extern "C"就是为了让c++编译程序以c语言的方式来处理名字,从而避免上述问题的发生。
 楼主| 发表于 2005-1-10 11:01:19 | 显示全部楼层
Post by doubleelec
在cpp里声明函数原形的时候用

这个我也试了,可是编译的时候还是出错,不去申明的话,程序编译是没问题的,以这么做编译就有问题了,请问大虾这又是怎么回事呢?
 楼主| 发表于 2005-1-10 11:05:15 | 显示全部楼层
我看了下面的这个例子:
// specifying_linkage2.cpp

// Declare printf with C linkage.
extern "C" int printf( const char *fmt, ... );

//  Cause everything in the specified header files
//   to have C linkage.
extern "C"
{
   // add your #include statements here
   #include <stdio.h>
}

//  Declare the two functions ShowChar and GetChar
//   with C linkage.
extern "C"
{
    char ShowChar( char ch );
    char GetChar( void );
}

//  Define the two functions ShowChar and GetChar
//   with C linkage.
extern "C" char ShowChar( char ch )
{
    putchar( ch );
    return ch;
}

extern "C" char GetChar( void )
{
    char ch;

    ch = getchar();
    return ch;
}

// Declare a global variable, errno, with C linkage.
extern "C" int errno;

int main()
{
}


例子应该是在cpp文件里的,上面的各种方法我都试过了,就下面这个可以
extern "C"
{
   // add your #include statements here
   #include <stdio.h>
}
别的加上编译就出问题,搞不懂到底怎么回事。
 楼主| 发表于 2005-1-10 11:18:23 | 显示全部楼层
我用:extern "C" int printf( const char *fmt, ... );
这种办法时在cpp文件里申明c函数原型,编译提示如下错误:
previous declaration of hashlist_create with c++ linkage.
confilcts with new declaration with c linkage
不明白这是为什么,望达人指点!
发表于 2005-1-10 11:54:10 | 显示全部楼层
这和怎么extern "C"无关,英文提示已经说得很明白了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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