エラー
C で書いた関数を Nim で使うとき
add.c
int addInts(int a, int b) {
return a + b;
}
add.nim
{.compile "add.c".}
proc addInts(a, b: cint): cint {.importc.}
when isMainModule:
echo addInts(3, 7)
みたいにすると
$ nim c -r add.nim
Hint: used config file '/etc/nim.cfg' [Conf]
Hint: system [Processing]Hint: add [Processing]
CC: add
CC: add
CC: stdlib_system
Hint: [Link]/home/username/Develop/Nim/nimcache/add.o: In function `PreMainInner':
add.c:(.text+0x1b): multiple definition of `PreMainInner'
/home/username/Develop/Nim/nimcache/add.o:add.c:(.text+0x1b): first defined here
/home/username/Develop/Nim/nimcache/add.o: In function `addDatInit000':
add.c:(.text+0x26a): multiple definition of `addDatInit000'
/home/username/Develop/Nim/nimcache/add.o:add.c:(.text+0x26a): first defined here
/home/username/Develop/Nim/nimcache/add.o: In function `PreMain':
add.c:(.text+0x2c): multiple definition of `PreMain'
/home/username/Develop/Nim/nimcache/add.o:add.c:(.text+0x2c): first defined here
/home/username/Develop/Nim/nimcache/add.o: In function `NimMainInner':
add.c:(.text+0x7c): multiple definition of `NimMainInner'
/home/username/Develop/Nim/nimcache/add.o:add.c:(.text+0x7c): first defined here
/home/username/Develop/Nim/nimcache/add.o: In function `NimMainModule':
add.c:(.text+0x1b1): multiple definition of `NimMainModule'
/home/username/Develop/Nim/nimcache/add.o:add.c:(.text+0x1b1): first defined here
/home/username/Develop/Nim/nimcache/add.o: In function `NimMain':
add.c:(.text+0x88): multiple definition of `NimMain'
/home/username/Develop/Nim/nimcache/add.o:add.c:(.text+0x88): first defined here
/home/username/Develop/Nim/nimcache/add.o: In function `main':
add.c:(.text+0xd8): multiple definition of `main'
/home/username/Develop/Nim/nimcache/add.o:add.c:(.text+0xd8): first defined here
/home/username/Develop/Nim/nimcache/add.o: In function `NimMainModule':
add.c:(.text+0x225): undefined reference to `addInts'
/home/username/Develop/Nim/nimcache/add.o: In function `NimMainModule':
add.c:(.text+0x225): undefined reference to `addInts'
collect2: error: ld returned 1 exit status
Error: execution of an external program failed: 'gcc -o /home/username/Develop/Nim/add /home/username/Develop/Nim/nimcache/add.o /home/username/Develop/Nim/nimcache/add.o /home/username/Develop/Nim/nimcache/stdlib_system.o -ldl'
エラーが出る。
解決策
*.nim
と *.c
の名前は同じにできないらしい。
add.c
の名前を logic.c
に、
add.nim
を calc.nim
に変え、
calc.nim
{.compile: "logic.c".}
proc addInts(a, b: cint): cint {.importc.}
when isMainModule:
echo addInts(3, 7)
のように修正すると
$ nim c -r calc.nim
Hint: used config file '/etc/nim.cfg' [Conf]
Hint: system [Processing]
Hint: calc [Processing]
CC: logic
CC: calc
CC: stdlib_system
Hint: [Link]
Hint: operation successful (11721 lines compiled; 0.821 sec total; 22.008MiB peakmem; Debug Build) [SuccessX]
Hint: /home/username/Develop/Nim/calc [Exec]
10
動いた。
参考
- Nim Backend Integration - https://nim-lang.org/docs/backends.html
- Multiple definition errors #1059 - https://github.com/nim-lang/Nim/issues/1059