Code::Blocks(后面缩写为CB)算是我非常喜欢的一款代码编辑器,相对于Visual Studio庞大的体积,简单爽快多了。
所以,当我得知NERvSDK自带插件示例能用CB和VS来编译时,我首先选择的是CB。
事与愿违的是,VS倒是很容易就编译成功了,但是使用CB却一直报错,如:
-------------- Build: win64 in Plug-in Demo (compiler: GNU GCC Compiler)---------------
windres.exe -Iinclude -I..\..\include -J rc -O coff -i D:\SAO\NERvSDK\samples\PLUG-I~1\res\res.rc -o obj\win64\res\res.res
mingw32-g++.exe -fno-rtti -fno-exceptions -DUNICODE -DWINVER=0x0500 -O2 -DNDEBUG -finput-charset=UTF-8 -fexec-charset=UTF-8 -Iinclude -I..\..\include -c "D:\SAO\NERvSDK\samples\Plug-in Demo\src\PluginDemo.cpp" -o obj\win64\src\PluginDemo.o
mingw32-g++.exe -shared -Wl,--dll -L..\..\lib\win64 obj\win64\src\PluginDemo.o obj\win64\res\res.res -o "..\Release\Plug-in Demo\module64.dll" -s -lNERvRES -lNERvSDK
obj\win64\src\PluginDemo.o:PluginDemo.cpp:(.text+0x23): undefined reference to `NERvLogMessageV'
obj\win64\src\PluginDemo.o:PluginDemo.cpp:(.text$_ZN8NERvGear12NerveObjectTI10PluginDemoLb0EE6AddRefEv+0x16): undefined reference to `__sync_add_and_fetch_4'
obj\win64\src\PluginDemo.o:PluginDemo.cpp:(.text$_ZN8NERvGear16NerveFactoryBase6AddRefEv+0x16): undefined reference to `__sync_add_and_fetch_4'
obj\win64\src\PluginDemo.o:PluginDemo.cpp:(.text$_ZN8NERvGear12NerveObjectTI10PluginDemoLb0EE7ReleaseEv+0x17): undefined reference to `__sync_sub_and_fetch_4'
obj\win64\src\PluginDemo.o:PluginDemo.cpp:(.text$_ZN8NERvGear16NerveFactoryBase7ReleaseEv+0x17): undefined reference to `__sync_sub_and_fetch_4'
obj\win64\src\PluginDemo.o:PluginDemo.cpp:(.text$_ZN8NERvGear13NerveFactoryTI10PluginDemoLb0EE16CreateInstanceExEPNS_6MODULEEPNS_8IUnknownERKNS_3UIDEPPv+0x56): undefined reference to `NERvTraceObject'
obj\win64\src\PluginDemo.o:PluginDemo.cpp:(.text$_ZN8NERvGear12NerveObjectTI10PluginDemoLb0EED0Ev[__ZN8NERvGear12NerveObjectTI10PluginDemoLb0EED0Ev]+0x2a): undefined reference to `NERvTraceObject'
obj\win64\src\PluginDemo.o:PluginDemo.cpp:(.text$_ZN8NERvGear12NerveObjectTI10PluginDemoLb0EED1Ev[__ZN8NERvGear12NerveObjectTI10PluginDemoLb0EED1Ev]+0x27): undefined reference to `NERvTraceObject'
obj\win64\src\PluginDemo.o:PluginDemo.cpp:(.text.startup+0x3): undefined reference to `_imp__NVG_ID_NULL'
obj\win64\src\PluginDemo.o:PluginDemo.cpp:(.text.startup+0xd): undefined reference to `_imp__NVG_ID_IUnknown'
obj\win64\src\PluginDemo.o:PluginDemo.cpp:(.text.startup+0x17): undefined reference to `_imp__NVG_ID_IClassFactory'
obj\win64\src\PluginDemo.o:PluginDemo.cpp:(.text.startup+0x21): undefined reference to `_imp__NVG_ID_IObjectFactory'
obj\win64\src\PluginDemo.o:PluginDemo.cpp:(.text.startup+0x2c): undefined reference to `_imp__NVG_ID_CPlugin'
obj\win64\src\PluginDemo.o:PluginDemo.cpp:(.text.startup+0x37): undefined reference to `_imp__NVG_ID_IPlugin'
collect2.exe: error: ld returned 1 exit status
Process terminated with status 1 (0 minute(s), 2 second(s))
14 error(s), 0 warning(s) (0 minute(s), 2 second(s))
之后,我多次尝试(此处省略尝试过程1255字)无果,也许只是因为本人对mingw使用不熟或是其他什么原因。
后来在Plug-in Demo.cbp
这个文件中发现<Option compiler="gnu_gcc_compiler_x64" />
这句话,经过多次百度后,转去使用bing来搜索,发现一篇相关度较高的文章CodeBlocks编译及创建wxWidgets 2.9.5工程(百度真是垃圾,浪费我多少时间)
这篇文章是和wxWidgets相关的,而SAO Utils也用到了wxWidgets,所以我猜想GPBeta可能也使用了类似方法。废话少说,直接说方法:
1、在http://tdm-gcc.tdragon.net/上下载最新版TDM-GCC,并安装,(如本人安装在D:\Program files\TDM-GCC
);
2、打开CB的Settings->Compiler
;
3、选择Global compiler settings
下Selected compiler
下的GNU GCC Compiler
,(一般默认就是这里);
4、点击Copy
按钮,在弹出的对话框中输入gnu_gcc_compiler_x64
,点击OK按钮,在Toolchain executables
选项卡下的Compiler's installation directory
下输入TDM-GCC的安装路径(我的是D:\Program files\TDM-GCC
),将下面三栏中的mingw32-gcc.exe和mingw32-g++.exe分别改成gcc.exe和g++.exe。
5、完成。