我尝试编译一个使用 SDL2 Image 和 Emscripten 的 Nim 项目,但遇到几个类型冲突错误。我可以在这个小代码片段中重现这个问题:
index.nim
import sdl2, sdl2.image
const imgFlags: cint = IMG_INIT_PNG
if image.init(imgFlags) != imgFlags:
raise Exception.newException(
"SDL2 Image initialization failed, SDL error: " & $getError())
nim.cfg
@if emscripten:
define = SDL_Static
gc = none
cc = clang
clang.exe = "emcc"
clang.linkerexe = "emcc"
clang.options.linker = ""
cpu = "i386"
out = "index.html"
warning[GcMem] = off
passC = "-Wno-warn-absolute-paths -I/path/to/SDL2/headers"
passL = "-s USE_SDL=2 -s USE_SDL_IMAGE=2 -s SDL2_IMAGE_FORMATS='[\"png\"]'"
@end
当我编译此代码片段时,出现错误:类型冲突
$ nim c -d:emscripten index.nim
Hint: used config file '/path/to/Nim/config/nim.cfg' [Conf]
Hint: used config file '/path/to/my-project/nim.cfg' [Conf]
Hint: system [Processing]
Hint: index [Processing]
Hint: sdl2 [Processing]
Hint: macros [Processing]
Hint: unsigned [Processing]
Hint: strutils [Processing]
Hint: parseutils [Processing]
Hint: math [Processing]
Hint: algorithm [Processing]
SDL2 will be statically linked. Please make sure you pass the correct linker flags (library search paths, linked libraries).
Hint: image [Processing]
CC: index
Error: execution of an external compiler program 'emcc -c -w -Wno-warn-absolute-paths -Iinclude -I/path/to/Nim/lib -o /path/to/my-project/nimcache/index.o /path/to/my-project/nimcache/index.c' failed with exit code: 1
/path/to/my-project/nimcache/index.c:65:21: error: conflicting types for 'SDL_GetError'
N_NIMCALL(NCSTRING, SDL_GetError)(void);
^
/path/to/SDL2/SDL_error.h:42:37: note: previous declaration is here
extern DECLSPEC const char *SDLCALL SDL_GetError(void);
^
我是否配置错误?我该如何修复它?
编辑:如果我从 nim.cfg 中删除 define = SDL_Static
,我不会收到此错误,但如果我这样做,我无法静态链接到 SDL。
Nim编译器版本0.16.1(2017-05-07)[Linux:amd64](devel分支最新版本)
emcc(Emscripten gcc/clang 类替换)1.37.9(提交 b5bee629cb54864e7e231ae55a7d0ae9bdc25c6c)
最佳答案
这是一个 bug由 this 修复拉取请求。它应该在 sdl2 包的 1.2 版中发布。在此之前,您可以从存储库安装最新(开发)版本:
nimble install sdl2#head
将 --dynlibOverride:SDL2
静态链接到 Nim 编译器。
关于使用 Emscripten 编译 Nim 和 SDL2 Image 时出现类型冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43855621/