Nim 交叉编译到 C
Nim cross compilation to C
我写了一个 Nim 程序,
echo("Hello.")
然后我尝试为 Linux 机器交叉编译,
nim c --cpu:i386 --os:linux -c hello.nim
这产生了以下输出:
config/nim.cfg(45, 2) Hint: added path: '/Users/connor/.babel/pkgs/' [Path]
config/nim.cfg(46, 2) Hint: added path: '/Users/connor/.nimble/pkgs/' [Path]
Hint: used config file '/usr/local/lib/nim-0.10.2/config/nim.cfg' [Conf]
Hint: system [Processing]
Hint: hello [Processing]
Hint: operation successful (8753 lines compiled; 0.140 sec total; 14.148MB)[SuccessX]
此时我换成nimcache/
目录,尝试执行:
gcc hello.c -o hello.o
但这给了我一个错误:
hello.c:5:10: fatal error: 'nimbase.h' file not found
#include "nimbase.h"
^
1 error generated.
我以为,"no biggie, I'll just find nimbase.h
and drop it in the nimcache
directory there,"但之后我得到了一个新的错误,
In file included from hello.c:5:
./nimbase.h:385:28: error: 'assert_numbits' declared as an array with a
negative size
...sizeof(NI) == sizeof(void*) && NIM_INTBITS == sizeof(NI)*8 ? 1 : -1];
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.
我不确定我应该用它做什么。我曾尝试使用 --genScript
选项,但这导致了类似的错误。我是 运行 OS X Yosemite.
谢谢!
更新:
我不确定 --cpu:
选项支持多少架构,但我在 What makes Nim practical 博客 post 上找到了一个(部分?)列表。我最后打电话了,
nim c --cpu:amd64 --os:linux -c hello.nim
这避免了我在 Linux 框上编译时看到的错误。如果您使用 Linux 或 OS X 不确定您的 CPU 架构是什么,您可以调用,
less /proc/cpuinfo
最后一个问题是因为您是 运行 gcc for x86_64 arch,而源代码是为 i386 arch 生成的。
我在从 GNU/Linux 机器上获取 nim
为 Windows 编译可执行文件时遇到了同样的问题,所以我制作了一个 bash
脚本。它采用包含 *.nim
个源文件的目录路径和要输出的可执行文件的名称。
我确定您可以更换 GCC 编译器(在本例中为 MinGW)并根据需要更改 --os:
开关:
#!/usr/bin/env bash
# Nim must generate C sources only, to be fed to MingW
nim c --cpu:amd64 --os:windows --opt:speed --embedsrc --threads:on --checks:on -c -d:release /*.nim
# Copy nimbase.h so MingW32 can find it during compilation and linking
cp /opt/Nim/lib/nimbase.h /nimcache/nimbase.h
mkdir -p /bin
cd /nimcache && x86_64-w64-mingw32-gcc -save-temps /nimcache/*.c -o /bin/.exe
rm /nimcache/*.{i,s} # only care about *.o objects
ls -lAhF /nimcache
ls -lAhF /bin
我写了一个 Nim 程序,
echo("Hello.")
然后我尝试为 Linux 机器交叉编译,
nim c --cpu:i386 --os:linux -c hello.nim
这产生了以下输出:
config/nim.cfg(45, 2) Hint: added path: '/Users/connor/.babel/pkgs/' [Path]
config/nim.cfg(46, 2) Hint: added path: '/Users/connor/.nimble/pkgs/' [Path]
Hint: used config file '/usr/local/lib/nim-0.10.2/config/nim.cfg' [Conf]
Hint: system [Processing]
Hint: hello [Processing]
Hint: operation successful (8753 lines compiled; 0.140 sec total; 14.148MB)[SuccessX]
此时我换成nimcache/
目录,尝试执行:
gcc hello.c -o hello.o
但这给了我一个错误:
hello.c:5:10: fatal error: 'nimbase.h' file not found
#include "nimbase.h"
^
1 error generated.
我以为,"no biggie, I'll just find nimbase.h
and drop it in the nimcache
directory there,"但之后我得到了一个新的错误,
In file included from hello.c:5:
./nimbase.h:385:28: error: 'assert_numbits' declared as an array with a
negative size
...sizeof(NI) == sizeof(void*) && NIM_INTBITS == sizeof(NI)*8 ? 1 : -1];
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.
我不确定我应该用它做什么。我曾尝试使用 --genScript
选项,但这导致了类似的错误。我是 运行 OS X Yosemite.
谢谢!
更新:
我不确定 --cpu:
选项支持多少架构,但我在 What makes Nim practical 博客 post 上找到了一个(部分?)列表。我最后打电话了,
nim c --cpu:amd64 --os:linux -c hello.nim
这避免了我在 Linux 框上编译时看到的错误。如果您使用 Linux 或 OS X 不确定您的 CPU 架构是什么,您可以调用,
less /proc/cpuinfo
最后一个问题是因为您是 运行 gcc for x86_64 arch,而源代码是为 i386 arch 生成的。
我在从 GNU/Linux 机器上获取 nim
为 Windows 编译可执行文件时遇到了同样的问题,所以我制作了一个 bash
脚本。它采用包含 *.nim
个源文件的目录路径和要输出的可执行文件的名称。
我确定您可以更换 GCC 编译器(在本例中为 MinGW)并根据需要更改 --os:
开关:
#!/usr/bin/env bash
# Nim must generate C sources only, to be fed to MingW
nim c --cpu:amd64 --os:windows --opt:speed --embedsrc --threads:on --checks:on -c -d:release /*.nim
# Copy nimbase.h so MingW32 can find it during compilation and linking
cp /opt/Nim/lib/nimbase.h /nimcache/nimbase.h
mkdir -p /bin
cd /nimcache && x86_64-w64-mingw32-gcc -save-temps /nimcache/*.c -o /bin/.exe
rm /nimcache/*.{i,s} # only care about *.o objects
ls -lAhF /nimcache
ls -lAhF /bin