写在开始

最近在尝试使用Godot这个游戏引擎,但是鉴于GDScript的性能过于弱鸡,所以我打算起步就使用GDNative用C/C++来编写主程序。

第一个坑:编译器

使用官方的教程来测试的时候,要使用cl进行编译

cl /Fosimple.obj /c simple.c /nologo -EHsc -DNDEBUG /MD /I. /I..\godot_headers
link /nologo /dll /out:..\simple\bin\libsimple.dll /implib:..\simple\bin\libsimple.lib simple.obj

最开始应该是直接在powershell里面找不到这个程序,然后出于习惯,打开了Developer Powershell for VS 2019

事实证明,能编译,也能链接,但是到了下面的步骤之后就发现问题了,运行的时候会出来这么一个错误:

Error 193: %1 is not a valid Win32 application.

错误日志
一开始因为我是中文系统在里面报了个中文的乱码错误,后来搜了一下之后最吻合的大概是这个意思。

搜到的结果大概是因为编译器用了32位的,然后把它当作64位的库导入了godot。

我看了一下我的配置,godot里配置的是64位的
gdnlib配置

一开始没往别处想,直到最后我在开发者工具里打了一下cl之后发现:
Developer Powershell for VS 2019上的cl编译器
这玩意果然是个x86的编译器,一瞬无语。

后来找到了一个叫x64 Native Tools Command Prompt for VS 2019的一个程序,这个的内置环境变量里的cl就是64位的了,用这个就解决了。

第二个坑:类名大小写

教程给的官方案例里的类名是全大写的,大概是这样

[gd_resource type="NativeScript" load_steps=2 format=2]

[ext_resource path="res://bin/simple.gdnlib" type="GDNativeLibrary" id=1]

[resource]
resource_name = "SIMPLE"
class_name = "SIMPLE"
library = ExtResource( 1 )
_sections_unfolded = [ "Resource" ]

但是class_name实际上应该是首字母大写的,改成这样就可以用了:

[gd_resource type="NativeScript" load_steps=2 format=2]

[ext_resource path="res://bin/simple.gdnlib" type="GDNativeLibrary" id=1]

[resource]
resource_name = "SIMPLE"
class_name = "Simple"
library = ExtResource( 1 )
_sections_unfolded = [ "Resource" ]

写在最后

也可能是我对godot不熟悉,或者说C/C++的编译相关的东西不熟悉,上来就踩了这么两个奇怪的坑,不过还算是好解决了吧,虽然解决过程中很令人气愤就是了。

Last modification:December 3rd, 2020 at 11:28 am