【问题标题】:Undefined symbol _main when trying to build logstalgia on mac尝试在mac上构建logstalgia时未定义的符号_main
【发布时间】:2009-10-08 21:56:51
【问题描述】:

我一直在尝试在我的 Mac (10.5) 上构建 logstalgia 项目 (http://code.google.com/p/logstalgia/)。我不必将其正确链接到系统库,而是构建了所有依赖项并将其添加到项目中。我是新手,但我确实认为我做得对,主要是因为我有两个更有经验的朋友这么说。

添加框架消除了所有编译错误,但我仍然收到链接器错误。似乎无法找到 main() 函数。我已经验证我在要编译的源代码中包含了 main.cpp(使用 XCode),并且没有意外的双重声明。我还验证了 main 函数的声明是否正确(没有缺少括号等)。

好像 XCode 没有以正确的顺序链接。任何帮助将不胜感激,我真的很高兴能遇到一个错误! (希望修复此问题不会打开闸门)。

谢谢, 汉密尔顿

PS - 如果有人愿意看,我绝对可以提供 Xcode 项目的 zip!

Checking Dependencies

Ld "/Users/hamiltont/Downloads/logstalgia-0.9.2 2/Untitled/build/Debug/Untitled" normal i386
    cd "/Users/hamiltont/Downloads/logstalgia-0.9.2 2/Untitled"
    setenv MACOSX_DEPLOYMENT_TARGET 10.5
    /developer/usr/bin/g++-4.0 -arch i386 -isysroot /developer/SDKs/MacOSX10.5.sdk "-L/Users/hamiltont/Downloads/logstalgia-0.9.2 2/Untitled/build/Debug" -L/sw/lib "-L/Users/hamiltont/Downloads/logstalgia-0.9.2 2/Untitled/../../pcre-7.9/.libs" -L/opt/local/lib -L/sw/lib "-F/Users/hamiltont/Downloads/logstalgia-0.9.2 2/Untitled/build/Debug" -F/Users/hamiltont/Downloads/logstalgia-0.9.2 -F2/src/SDL.framework "-F/Users/hamiltont/Downloads/logstalgia-0.9.2 2/Untitled" -filelist "/Users/hamiltont/Downloads/logstalgia-0.9.2 2/Untitled/build/Untitled.build/Debug/Untitled.build/Objects-normal/i386/Untitled.LinkFileList" -mmacosx-version-min=10.5 -framework OpenGL -lpcre -lSDL -lSDL_image-1.2.0 -prebind -o "/Users/hamiltont/Downloads/logstalgia-0.9.2 2/Untitled/build/Debug/Untitled"
Undefined symbols:
  "_main", referenced from:
      start in crt1.10.5.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

【问题讨论】:

标签: c++ xcode macos open-source linker


【解决方案1】:

我让这个错误消失了。如果我理解的话,本质上是 SDL 重新命名了 main 函数,以便它可以做一些事情,然后运行您的应用程序,然后进行清理。事实证明,如果您在 Xcode 中构建,您必须使用 ObjectiveC 来编译您的应用程序。

在 Xcode 中,告诉链接器尝试使用SDL_main(),而不仅仅是main() 不起作用(出于一些我无法理解的技术原因)。因此,您包含了一些 Objective C 文件。在 Oc 中,您可以清楚地说出主类的名称是什么。因此,您包含的 Objective C 文件似乎只是让 Xcode 知道寻找 SDL_main()

总之,这确实与 Logstalgia 无关,但完全是让 SDL 在 Xcode 中正确链接的问题。 This link 正是在谈论这个问题。 SDLMain.h 和 SDLMain.m 是 Objective C 文件。如果找不到它们,请尝试在 Google 上搜索“在 Xcode 中设置 SDL 模板”。我在 Xcode 中安装了模板,使用其中一个创建了一个可以编译、链接和运行的空项目(并且立即什么都不做!),然后我将我想要的项目文件添加到预配置的项目中。

谢谢!

【讨论】:

    【解决方案2】:

    仔细检查链接文件列表以确保 main.cpp 的目标文件存在于那里:

    /Users/hamiltont/Downloads/logstalgia-0.9.2 2/Untitled/build/Untitled.build/Debug/Untitled.build/Objects-normal/i386/Untitled.LinkFileList
    

    您可能还想预处理 main.cpp 以确保 main 不会被无意重命名(通过流氓宏)或被忽略(通过流氓 #if)。

    【讨论】:

    • fbrereto,感谢您的快速回复。我检查了 LinkFileList,main.o 是第一个条目。此外,我验证了主文件没有被宏省略(幸运的是,它没有在任何宏中定义)。我不确定如何检查它是否被重命名。构建文件夹中有一个 main.o,这似乎表明它不是,但我在这里可能是错误的
    • 我建议对 main 例程进行这些检查,而不是 main.cpp 文件 - 对那里的混乱感到抱歉。您可以通过在 XCode 中右键单击文件并从上下文菜单中选择选项来预处理文件。一旦输出弹出,你会想要滚动到文件的最底部——它会很大!确保 main 看起来像它应该的那样,它 a) 存在并且 b) 被称为你所期望的。
    • fbrereto,我认为您对流氓宏的看法是正确的!我在这方面做了更多工作 - 一个 nm main.o | grep main 只显示 _SDL_main 我进入了 SDL 框架头文件,在 SDLmain.h 中,我看到了: /* 应用程序的 main() 函数必须使用 C 链接调用,并且应该这样声明:#ifdef __cplusplus extern" C" #endif int main(int argc, char argv[]) { } */ #define main SDL_main / 应用程序 main() 函数的原型 */ extern C_LINKAGE int SDL_main(int argc,字符 *argv[]);知道我需要做什么吗?
    • 刚刚阅读您的评论,但这绝对是它的内容,如果我滚动到预处理文件的底部,我会看到 int SDL_main (int argc, char * argv[]);有什么想法我应该从这里做什么?
    • 我会阅读有关设置您的第一个 SDL 应用程序的 SDL 文档...这超出了我所熟悉的范围。您也可以在 Stack Overflow 上发布另一个问题。
    最近更新 更多