为什么我无法使用 C++在 Mac 上编译 SDL 以进行x86_64?
Why can't I compile SDL on Mac for x86_64 using C++?
我在Mac Mini上运行,2012年底(最新),64位,英特尔酷睿i7 2.3 gHz超线程x86_64,或者我的电脑这么说。我暂时也在使用 Code::blocks,因为 Xcode 中的帮助(我更喜欢)更加稀疏,因为我使用的是C++。 也就是说,编程语言的选择是C++的,最终会扩展到Objective-C++,但那是另一天。
问题是这样的:我正在尝试编译一个程序,这个程序可以 我还不太确定是什么(它是一个模板,让我们说它现在是一个游戏)使用 SDL 1.2.15,这是我从 Mac 上的源代码编译的。 (我确实尝试使用 SDLmain.m 和 SDL.h,但那充满了 Objective-C 代码, 由于我找不到关于C++我是否可以在互联网上使用这些代码的好信息,所以我放弃了。我编译的源代码似乎工作得很好,Code::Blocks可以编译它的教程,运行正常。但是,我似乎无法让我的游戏模板工作。它编译正常,没有错误或警告,但链接器不会执行相同的操作。现在,我真的不确定ld
做什么,我只知道它将代码链接在一起。(有人想详细说明吗?当 Code::Blocks 到达它的链接步骤时,它会失败并显示以下消息:
-------------- Clean: Debug in PyroLauncher ---------------
Cleaned "PyroLauncher - Debug"
-------------- Build: Debug in PyroLauncher ---------------
Compiling: App.cpp
Compiling: OnCleanup.cpp
Compiling: OnEvent.cpp
Compiling: OnInit.cpp
Compiling: OnLoop.cpp
Compiling: OnRender.cpp
Linking console executable: bin/Debug/PyroLauncher
Undefined symbols for architecture x86_64:
"_SDL_GetError", referenced from:
App::OnInit() in OnInit.o
"_SDL_Init", referenced from:
App::OnInit() in OnInit.o
"_SDL_PollEvent", referenced from:
App::OnExecute() in App.o
"_SDL_Quit", referenced from:
App::OnCleanup() in OnCleanup.o
"_SDL_SetVideoMode", referenced from:
App::OnInit() in OnInit.o
"_main", referenced from:
start in crt1.10.6.o
(maybe you meant: _SDL_main)
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
Process terminated with status 1 (0 minutes, 0 seconds)
0 errors, 0 warnings
这让我非常困惑。我只知道 ld 找不到我的原生架构x86_64。如果有人可以帮助我,将不胜感激。 我认为解决方案可能是:(但是我不知道该怎么做。 SDL 不是针对 64 位编译的,因此不能针对 64 位代码进行编译。 SDL 是为 Objective-C 编译的,因此不能与C++中的代码一起使用。 我的代码是 32 位,SDL 是 64 位,它们不兼容。
你明白这里发生了什么吗?代码正在调用链接器 (ld) 找不到的函数。
两个主要的可能性是,您需要在项目中包含更多文件,或者需要定义一些宏。
在项目中搜索SDL_GetError()
(和其他)的定义。如果你没有找到它,那么你需要找到声明它的文件并包含它。
如果你找到了它,那么它可能会被#ifdef XXXX
包围,你必须在项目选项(而不是代码)中定义xxxx
。大多数好的IDE(我使用NetBeans,使用Cygwin进行C +开发)如果未定义ifdef
,则会使当时的内容变灰,因此您可以清楚地看到是否是这种情况。
顺便说一下,请查看 SDL 网站以获取安装说明。或者,您的下载可能包含一个名为"安装"或"安装.txt"的文件,也可能具有生成文件。如果是这样,则在IDE中查找选项"项目/新建...从现有的生成文件。
希望这有帮助。
您需要将文件 SDLMain.m 和 SDLMain.h 添加到项目中。SDLMain 文件包含胶水代码,因此 SDL 代码可以在 Mac OS X 上运行。您还需要将 Cocoa 框架链接到您的项目。SDL 的 Mac 版本是用 Cocoa 编写的,因此您需要链接到 Cocoa。链接Cocoa框架不会强迫你使用Objective-C。你可以用C++编写游戏。
如果您正在寻找有关使用 Xcode 4 设置 SDL 的信息,请阅读以下文章:
将 SDL 与 Xcode 4 结合使用
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- Mix_Init和Mix_OpenAudio SDL之间的区别是什么
- SDL 窗口不会弹出
- 为x86而非x64编译时出错
- C++如何仅使用MOV在x86上实现发布和获取
- SDL 操纵杆按钮按下/C++
- VSCode IntelliSense无法识别SDL框架的SDL_image扩展库
- C++/SDL "initial value of reference to a non-const must be an lvalue"
- SDL 映像:无法打开映像,仅显示错误消息
- 如何在 3D OpenGL 场景上绘制 SDL 2D 矩形?
- 在 c++ 中使用 x86 DIV 的这个 asm 块有什么用?
- 在 x86 上实现 std::atomic_thread_fence(std::memory_order_seq_cst
- "Undefined symbols for architecture x86_64" 在 SDL 2 (macOS) 中
- 如何将C++子例程链接到 x86 程序集程序?
- 为什么 SDL 在 Mac 上比 Linux 慢得多?
- 在 OSX 上打开 SDL 窗口时不要打开终端窗口
- 如何在 x86 处理器上实现"锁定添加"
- 您选择的 CPU 不支持 x86-64 指令集
- SDL + OpenGL ES 2.0 使用着色器显示纹理
- 从 zip 加载到 SDL,代码在 x64 中工作,但不能在 x86 中工作