【问题标题】:g++ error regarding undefined reference to typedef关于未定义对 typedef 的引用的 g++ 错误
【发布时间】:2011-12-22 15:50:21
【问题描述】:

我正在尝试编译一个简单的测试程序,我包含的头文件之一具有以下 typedef

typedef const char* CharConst;
typedef unsigned int MyBool; 

在头文件的后面,一些函数是使用这个typedef定义的。像这样的东西:

MyBool add_att(CharConst attr, const char*);

当我尝试调用此函数时出现错误,调用如下:

CharConst myconst = "some text";
const char* more_text = "more text";
add_att(myconst, more_text);

错误是:未定义引用 `MyClass::add_att(char const*, char const*)'

似乎编译器不喜欢第一个参数已经在头文件中进行了类型定义的事实。但它不介意 MyBool。编译器只抱怨 CharConst 定义。

有什么简单的方法可以解决这个问题吗?关于我能做什么的任何线索或提示?我正在运行 gcc 4.6.2 版

【问题讨论】:

  • 在定义中显示函数签名。也永远不要在指针类型上使用typedef,它会让人困惑,而且这样的问题总是会随之而来。
  • 您是否在尝试调用该函数的文件中包含了声明/定义add_att() 的头文件? add_att() 是否在一个库中定义而您忘记链接到该库?
  • typedef 不应该有任何区别(除了让任何试图阅读代码的人感到困惑之外)。看起来您还没有实现该功能,或者您没有链接到包含其实现的文件。
  • 是的,我有一个包含,否则编译器会抱怨的不仅仅是这个。根据库,我的编译行如下所示: g++ main.cpp myclass.cpp -L/opt/stuff/lib -lstuff 任何线索? lib 文件夹包含 libstuff.a、libstuff_c++.a、libstuff_c++.la 和 libstuff.la。我需要一个so文件吗?
  • @jasonmclose:函数是在myclass.cpp中定义的吗?基本上,您向我们展示的代码就可以了。而且这不是超出玩具阶段的编译器可能会犯的那种错误,因此它成为编译器问题的可能性(你已经很小了)是天文数字。所以错误一定是在你没有向我们展示的代码中,并且给出了确切的错误,可能与链接有关。

标签: c++ linux compiler-construction g++ typedef


【解决方案1】:

从错误看来 add_att 是一个类的方法;我没有看到您的类的实例来调用该方法。考虑一下: MyClass *m = new MyClass(); m->add_att(....)

或者,确保函数是实际定义的,而不仅仅是原型。此外,这可能无关紧要,但在函数定义期间 - 您是否在函数参数中使用 typedef ?其实这应该没关系...类型是一样的。

【讨论】:

  • 我对此进行了更深入的研究。原来我的 gcc 版本(这是非常新的)在静态链接方面还不够好,我需要在这个库(.a 文件)中进行静态链接。我正在重新编译库以使用共享对象(奇怪的是,这不是这个库的默认方式)。将很快重试。
  • 很可能就是这样;但是,除非您在同一硬件上使用另一个版本进行了测试,否则请尽量避免责怪编译器。我喜欢责怪编译器和驱动程序(男孩,我喜欢责怪驱动程序!)但大多数时候它是你的东西,或者其他库。尝试使用不同版本的 GCC 进行测试;虽然 4.6.2 对我来说工作得很好(解决的问题比它创造的要多,哈哈)。
  • 好的。这一定是我尝试编译的问题。
  • 这就是我的做法:gcc -o mytest main.cpp MyFile.cpp -L/opt/stuff/lib -lstuff - 这不应该吗? lib目录下有一个libstuff.so文件。
  • 吉米尼圣诞节。把它修好了。显然,在 -lstuff 库之前必须包含另一个库。我不得不爬过互联网的深处才能弄清楚这一点。现在已经搜索了大约4个小时。感谢所有想提供帮助的人。这是任何人都无法知道的事情之一,只是因为我使用的特定库。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-09
  • 2012-12-05
  • 2010-09-23
  • 1970-01-01
  • 2021-01-31
  • 2011-08-28
相关资源
最近更新 更多