我该如何在Code Blocks中编译Objective-C?

3
我下载了与GCC捆绑的Codeblocks从这里
C部分运行正常。
我阅读了这个维基教程,它说有了GCC,只需将-lobjc添加到编译器选项中就可以编译Objective-C。
然而,我已经按照教程中提到的步骤添加了-lobjc选项,但它无法编译。

enter image description here

这是我在CodeBlocks中收到的构建错误信息:
-------------- Build: Debug in test_prog_proj (compiler: GNU GCC Obj-C Compiler)---------------

mingw32-gcc.exe -Wall -g  -c D:\backup\cb_files\objc_files\test_prog_proj\test_prog.m -o obj\Debug\test_prog.o
mingw32-gcc.exe: error: CreateProcess: No such file or directory
Process terminated with status 1 (0 minute(s), 2 second(s))
1 error(s), 0 warning(s) (0 minute(s), 2 second(s))

如上所示,它并未显示-lobjc选项。
我也尝试在Windows cmd中手动编译上述程序,进入包含.m文件的文件夹。我给出了以下命令:
mingw32-gcc.exe -Wall -g  -c D:\backup\cb_files\objc_files\test_prog_proj\test_prog.m -o obj\Debug\test_prog.o -lobjc 

但是我在命令提示符中得到了相同的错误

mingw32-gcc.exe: error: CreateProcess: No such file or directory  

我也尝试了

gcc -g -fgnu-runtime -O -c some_class.m  

我从这里获取了信息,但它仍然给我相同的“CreateProcess”错误。 我如何在Windows上开始编译Objective C代码(最好使用GCC和Codeblocks)?
---编辑1---
如下Mike Kinghan's回答中所建议的,我卸载了旧的Codeblocks安装程序,然后单独重新安装了MinGW和codeblocks。 Codeblocks卸载程序删除了Program Files中的Codeblocks文件夹,但当我再次安装Codeblocks时(没有包含MinGW的版本),我先前安装的“GNU GCC Obj-C”设置仍然存在,并且在“链接器设置”选项卡中还有-lobjc标志。
但问题是仍然不起作用。 如果我尝试从Codeblocks构建,则会出现以下错误:
Goto "Settings->Compiler...->Global compiler settings->GNU GCC Obj-C Compiler->Toolchain executables" and fix the compiler's setup.

Tried to run compiler executable 'C:\Program Files\CodeBlocks\MinGW/bin/mingw32-gcc.exe', but failed!

Skipping... Nothing to be done (all items are up-to-date).  

这是 Toolchains executable 的外观:

enter image description here

如果我尝试通过cmd编译它,需要进入包含.m文件的文件夹并输入命令。
mingw32-gcc.exe -Wall -g  -c D:\backup\cb_files\objc_files\test_prog_proj\test_prog.m -o obj\Debug\test_prog.o -lobjc  

它会返回错误。
mingw32-gcc.exe: error: CreateProcess: No such file or directory    

这里有什么问题?
--- 编辑 2 ---
根据Mike Kinghan的建议,我删除了编译器列表中旧版的“GNU GCC Obj-C Compiler”,并重新创建了当前版本的“GNU GCC Compiler”。
但是,程序仍然无法运行。这是我在构建日志中收到的消息:
-------------- Build: Debug in test_prog_proj (compiler: GNU GCC Obj-C Compiler)---------------

Linking stage skipped (build target has no object files to link)
Nothing to be done (all items are up-to-date).  

清理项目并重新构建后仍然显示相同的消息。尝试无论如何运行该项目都会弹出对话框,提示该项目尚未构建,并且单击“是”以构建该项目只会再次弹出相同的“项目尚未构建”对话框。在“项目”选项卡的“工作区树”中,文件图标似乎也变灰了:

enter image description here

这就是工具链可执行文件的样子:

enter image description here

我已经在链接器设置中添加了-lobjc,就像这里提到的那样。
我右键单击项目树中的项目图标,进入构建选项,并在链接器设置中添加了-lobjc。

enter image description here

目前这个项目存在什么问题?

--- 编辑 3 ---

我最终彻底卸载了 Codeblocks(从 Windows 开始菜单中卸载,在%APPDATA% 中删除 codeblocks 文件夹),卸载了 MinGW(删除 c:\MinGW 文件夹),并从头开始重新安装了所有东西。 我按照Wiki中的所有说明操作(除了Troubleshooting部分,但我认为那部分不相关),它仍然无法工作(与本帖子中编辑2描述的问题相同)。

如何让 Codeblocks 检测和编译 obj-C 代码?此外,当我尝试从 Codeblocks 界面构建它时,它不会显示编译器命令行参数。为什么会这样,我该如何让它显示使用的完整命令行?


在MinGW安装的libexec文件夹下,您会找到一个名为cc1.exe的程序。(在我的情况下,是C:\MinGW\libexec\gcc\mingw32\6.3.0\cc1.exe)。 在与cc1.exe相同的文件夹中,您是否看到一个名为cc1obj.exe的程序? - Mike Kinghan
@MikeKinghan,在C:\Program Files\CodeBlocks\MinGW\libexec\gcc\mingw32\4.9.2路径下只有cc1.exe。 - user13267
这是不是意味着我没有Objective-C编译器? - user13267
1个回答

2
我们通常稀释为“编译器”的GCC程序[mingw32-](gcc|g++),实际上是一个调用真正的语言编译器和/或链接器的编译器/链接器前端,具体取决于输入文件和命令行选项所指示的操作。
扩展名为.m的输入文件表示它们是要使用GNU Objective C编译器cc1obj编译的Objective C源文件。但您没有安装它,因此出现了您看到的错误。
GCC安装将包括C编译器cc1,以及可选的其他语言编译器:C ++,Fortran,Objective(C | C ++),Go等。您说您的MinGW GCC安装是与Code :: Blocks捆绑在一起的。由于维护者认为Objective C是一个小众语言,因此这个捆绑的MinGW省略了Objective C编译器cc1obj
最好删除您的CB安装和捆绑的MinGW,然后从竞争对手项目之一中独立安装MinGW GCC。
https://sourceforge.net/projects/mingw-w64/
https://sourceforge.net/projects/mingw/

运行安装程序,并确保您获得了Objective C以及您想要的其他编译器。然后,使用codeblocks-17.12-setup.exe安装程序(而不是codeblocks-17.12mingw-setup.exe)替换您的CB安装,该安装程序可从 https://sourceforge.net/projects/codeblocks/files/Binaries/17.12/Windows/ 下载。此安装程序不包含任何编译器,并将自动检测您的MinGW安装。然后按照之前的步骤在CB IDE中创建GNU GCC Obj-C编译器设置。
稍后......仍然没有用
您之前的CB安装持久保存了您的 GNU GCC Obj-C 编译器设置,并且由于新的MinGW安装不再是Code :: Blocks的一部分,因此已过时。正如您所见,它仍在寻找位于 C:\ Program Files \ Codeblocks \ MinGW 中的工具链可执行文件,而您的新MinGW位于其他位置。
重新安装Code::Blocks时,您应该看到它尝试自动检测编译器,并且它检测到您的MinGW工具链在(例如) C:\ MinGW 中。它将根据此配置一个GNU GCC Compiler的编译器设置,并具有正确的工具链可执行文件路径。但是,它不会修改您自己创建的任何持久性编译器设置,例如 GNU GCC Obj-C
首先,请通过创建“ Hello world” C控制台项目并查看您是否可以构建它来检查自动检测的设置 GNU GCC Compiler是否正确。我认为您能做到,但如果不能,请手动设置编译器的安装目录中的 GNU GCC Compiler 设置。
然后,为您的 GNU GCC Obj-C 编译器设置设置相同的编译器的安装目录

你好,能否请您检查一下我的编辑?我已经得到了cc1obj.exe文件,但它仍然无法工作。 - user13267
谢谢您的更新。我现在不在那台电脑旁边,所以我只能稍后进行详细测试,但我已经检查过一个C控制台“hello world”项目可以正常编译。 - user13267
清理通常会发生。"-------------- 清理:在test_prog_proj中进行调试(编译器:GNU GCC Obj-C编译器)---------------已清理“test_prog_proj - Debug” 完成。" - user13267
这是构建后的“构建日志”:“-------------- 在test_prog_proj中构建:Debug(编译器:GNU GCC Obj-C编译器)---------------链接阶段被跳过(构建目标没有要链接的对象文件) 无需执行任何操作(所有项目都是最新的)。 - user13267
@user13267 应该可以;我看到它没有,但我不知道为什么。 - Mike Kinghan
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接