【问题标题】:Linker error when declaring a function just before calling it在调用函数之前声明函数时出现链接器错误
【发布时间】:2012-10-15 08:51:09
【问题描述】:

我的游戏中有一个更新函数,其中包含以下代码:

void DrawMiniFPSCounter();
DrawMiniFPSCounter();

DrawMiniFPSCounter() 函数在名为 miniFPSCounter.cpp 的文件中声明,该文件是构建目标的一部分(我使用的是 Xcode)。构建时,我收到一个链接器错误,提示找不到 DrawMiniFPSCounter 符号。我试过删除上面的声明,只调用DrawMiniFPSCounter(),但这会导致编译过程中出现“未找到符号”错误。为什么链接器很难找到这个符号?是不是和项目中解析符号的顺序有关?

编辑:我在构建目录中运行命令nm hrMiniFPSCounter.o | grep Draw,得到以下输出:

00000000 T __Z15DrawMiniCounteriiiii
0002d040 S __Z15DrawMiniCounteriiiii.eh
00000a00 T __Z18DrawMiniFPSCounterv
0002d148 S __Z18DrawMiniFPSCounterv.eh
00000560 t __ZL9DrawDigitiiib
0002d128 s __ZL9DrawDigitiiib.eh

这正常吗?为什么函数名末尾有多余的字符?

【问题讨论】:

    标签: c++ xcode linker clang undefined-symbol


    【解决方案1】:

    根据我的经验最常见的“错误”:

    1. 文件(真的)编译了吗?
    2. 它(真的)链接正确吗?
    3. 您是否给函数取了自以为是的名称?
    4. 命名空间问题:)

    您确定 miniFPSCounter.cpp 文件已编译(/已以正确的方式包含在项目中)吗?我猜您遇到的情况可能是由一些不同的事情引起的,但是由于缺乏更多信息,我想说:尝试确保正在编译 cpp 文件(可能会引入一些语法错误,从而导致编译如果确实已编译,则会出错),当您确定这一点时,您可以开始检查其他内容(例如它是否正确链接等)

    编辑:将清单放在首位。

    【讨论】:

    • 我在 hrMiniFPSCounter.cpp 的开头添加了#error Compiling mini fps counter,它触发了该错误,所以我猜这意味着它正在编译。如何检查它是否正确链接?如果有帮助,我可以看到该文件处于目标的“编译源”阶段。
    • 嗯,我认为理论上并不一定意味着它正在被编译,因为(通常)有一个预处理阶段可以解析编译指示和宏等,以准备汇编。但可以肯定的是,实际上它可能正在编译,就像你提到的那样。我仍然会尝试一些语法错误,然后纠正这些语法错误并让它编译只是为了知道正在创建一个新的目标文件。 (在这些情况下,干净的构建永远不会出错)。
    • 至于是否链接正确。唔。我会检查它是否包含在“链接阶段”规范中,是否有一个(XCode 上有点生疏),并尝试列出目标文件中的符号。也许函数符号的命名方式出人意料(例如由于某些 C++ 名称修改问题)。我有点不确定如何在 XCode 中列出符号,但 nm 似乎是一个不错的选择。 developer.apple.com/library/mac/#documentation/Darwin/Reference/…
    • 我又试了一次,在文件顶部附近添加了一行 float int; 并给出了语法错误。然后我再次清理并构建,我仍然收到缺少符号的错误。然后我转到带有.o 文件的文件夹并运行nm hrMiniFPSCounter.o | grep Draw。我将编辑我的原始问题以显示输出(它不会在评论中很好地格式化)。
    • 你有命名空间中的函数吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    相关资源
    最近更新 更多