【问题标题】:Mixing C and C++ code yields unexpected behavior in GCC混合 C 和 C++ 代码会在 GCC 中产生意外行为
【发布时间】:2012-08-26 16:21:15
【问题描述】:

我在当前的 C++ 项目中通过包含外部头文件来使用旧版 C 代码:

extern "C" {
# include "ANN/ANN_4t70P1.h"
# include "ANN/ANN_4t70P2.h"
# include "ANN/ANN_4t70P3.h"
# include "ANN/ANN_4t70P4.h"
}

头文件如下所示:

extern int ANN_4t70P1(float *in, float *out, int init);

static struct {
  int NoOfInput;    /* Number of Input Units  */
  int NoOfOutput;   /* Number of Output Units */
  int(* propFunc)(float *, float*, int);
} ANN_4t70P1REC = {8,3,ANN_4t70P1};

C 代码是由一个古老的批处理文件创建的,不能使用 C++ 编译器进行编译。不过,此实现适用于 Windows 和 Mac OS。但是,当我在 Linux 上使用 gcc 和 g++ 编译代码并运行应用程序时,ANN_4t70P1REC 返回的值不正确。

我在链接项目时是否遗漏了任何特殊的链接器标志?

谢谢!

【问题讨论】:

  • ANN_4t70P1REC 是结构体的一个实例。当您说它“返回不正确的值”时,具体是什么意思?
  • 也许您需要全部编译成 32 位?较新的机器可以安装为 64 位,因此您可能需要添加 -m32 编译器标志
  • 对不起。当然,我的意思是实例 ANN_4t70P1REC 中的函数 propFunc 返回意外结果。这些值似乎不是随机值或未分配的内存,但它们与我使用 XCode 或 VC++ 获得的值完全不同。
  • 制作一个小型的纯 C 测试程序,并检查它是否返回正确的值。
  • 你没有像将 *propFunc 存储在 int 某处这样奇怪的东西吗?在 64 位机器上,指针将是 8 个字节,而不是 4 个。按照建议,尝试-m32 看看是否会有所不同。

标签: c++ c compiler-errors


【解决方案1】:

什么意思:

C 代码是由一个古老的批处理文件创建的,无法编译 使用 C++ 编译器

您是否使用不同编译器生成的目标文件进行链接? 如果是这样,请尝试使用以下命令检查您的目标文件:

readelf -h <objectname>

检查是否有不同的 ABI。如果代码是由非常旧的 GCC

您确定在链接过程中没有任何警告吗?

【讨论】:

    猜你喜欢
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    相关资源
    最近更新 更多