簡體   English   中英

AmigaShell C++ (m68k-amigaos-g++) 和命令行 arguments

[英]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 覆蓋它是正常的嗎? 我將它添加到__stdargsmain() function。無論如何,這沒有幫助。

接下來,我再次在某個論壇上讀到,鏈接編譯器 output 時必須使用-mcrt參數。 我一直在努力尋找參數的用途。 它似乎指定要鏈接哪個標准 C 庫(類似於glibc )? 根據谷歌,參數的以下可能變體( -mcrt=nix13-mcrt=nix20mcrt=clib2 )(參見例如https://github.com/adtools/libnix )。

唯一運行良好的是nix20nix13沒有鏈接, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM