[英]AmigaShell C++ (m68k-amigaos-g++) and command line arguments
我已经尝试在 Amiga 1200 (Workbench 3.1.4) 上的一个小程序 C++ 中使用命令行 arguments。
我使用 bebbo 的交叉编译器 g++ ( m68k-amigaos-g++
)(参见https://github.com/bebbo/amiga-gcc )编译了一个简单的 CLI 应用程序,它只输出 arguments。虽然它在以下情况下工作正常在 Windows 中使用“正常”g++ 编译,它在 Amiga Forever 模拟器和 Amiga 1200 机器的 AmigaShell 中失败。
我在一些论坛上发现应该使用预处理器符号__stdargs
,据我所知,它指示编译器处理生成的汇编程序,就好像 function 是使用堆栈上传递的参数调用的,而不是使用寄存器。 这样理解正确吗?
Amiga(和 g++)默认使用寄存器并且需要为 AmigaShell 覆盖它是正常的吗? 我将它添加到__stdargs
到main()
function。无论如何,这没有帮助。
接下来,我再次在某个论坛上读到,链接编译器 output 时必须使用-mcrt
参数。 我一直在努力寻找参数的用途。 它似乎指定要链接哪个标准 C 库(类似于glibc
)? 根据谷歌,参数的以下可能变体( -mcrt=nix13
、 -mcrt=nix20
和mcrt=clib2
)(参见例如https://github.com/adtools/libnix )。
唯一运行良好的是nix20
( nix13
没有链接, clib2
链接,但该程序在 Amiga 上无法运行。为什么首先我们需要标准的 C 库?
我已经将它与-mcrt
一起使用: m68k-amigaos-g++ args.o -mcrt=nix20 -o args
并且它终于起作用了:
任何人都可以向我作为新手描述所有这一切的更多背景细节吗?
这是我的测试程序:
#include <iostream>
using std::cout;
#if defined (__AMIGA__)
#define MAIN_FNC __stdargs
#else
#define MAIN_FNC
#endif
MAIN_FNC int main( int argc, char *argv[] )
{
cout << "Arguments count:" << argc << " \n";
for ( int i = 0; i < argc; i ++ )
cout << i << ". [" << argv[i] << "]\n";
return 0;
}
您不需要任何MAIN_FNC
,将其删除。 也不需要玩-mcrt=xxx
。 只需链接-noixemul
选项。
m68k-amigaos-g++ args.o -noixemul -o args
默认情况下使用/链接ixemul.library (简而言之,非常简单的ixemul.library模拟一些 unix 行为,请参见此处)。 那会导致你的问题。
有关与-noixemul
和 AmigaOS 相关的 -noixemul 的更多信息,请访问: GCC 和 ixemul.library
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.