[英]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.