【问题标题】:What's wrong withe following C code!以下 C 代码有什么问题!
【发布时间】:2011-10-10 20:47:28
【问题描述】:

我在 C 和 C++ 中尝试了以下代码。file1 是一个 c 文件。file2 是一个 c++ 文件,file3 是一个用于名称转换的头文件。

file1.c

#include<stdio.h>
#include<stdlib.h>
#include "file3.hpp"

int main(int argc,char **argv)
{
int a[5];
int i;
for(i=0;i<5;i++)
    a[i] = i;
printf("%d",a[17]);
return 0;
}

file2.cpp

#include "file3.hpp"

int printtrial(int number)
{
return number;
}

file3.hpp

#ifdef __cplusplus
extern "C"
{
#endif

extern int printtrial(int number);

#ifdef __cplusplus
}
#endif

我使用以下命令编译它:

gcc -c file1.c
g++ -c file2.cpp
gcc -o output file1.o file2.o

在这方面它给出了错误:

file2.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status

谁能告诉我发生了什么事!

【问题讨论】:

  • 要研究问题的根源,您可以使用命令nmobjdump -t 列出.o 文件中的符号,然后您就会看到真相。事实上,您在我的环境中的代码(Windows 上的 MinGW)运行良好,因为 file2.o 不包含冗余符号。
  • Re "printf("%d",a[17])" : a 被声明为 int a[5]; 所以 a[17] 是未定义的行为。关于“file2 是 c++ 文件,file3 是用于名称修饰的头文件”:file3 是 not 用于名称修饰的头文件。它可以防止名称修改。它强制 g++ 将 printtrial() 视为 C 函数。顺便说一句,这是“名称修饰”,而不是“名称修饰”。当您输入该问题时,“magling”一词应该出现带有红色下划线。这意味着它是一个拼写错误的单词。注意!

标签: c++ c


【解决方案1】:

由于您的文件之一被编译为 c++,请使用 g++ 进行链接阶段。

见:What is __gxx_personality_v0 for?

【讨论】:

    【解决方案2】:

    C 和 C++ 可执行文件需要存在一些库,这些库包含在链接阶段:

    gcc -o output file1.o file2.o
    

    这里的问题是您正在尝试使用 C 链接器链接 C++ 文件。 gcc 根本无法找到 C++ 运行时所需的一些库。要解决这个问题,你必须使用 g++,就像 yi_H 说的那样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多