將 Linux 應用程式移植到 64 位系統上 2

2021-09-02 19:35:26 字數 1804 閱讀 7778

從 32 位系統移植到 64 位系統

本節介紹如何解決一些常見的問題:

宣告要想讓您的**在 32 位和 64 位系統上都可以工作,請注意以下有關宣告的用法:

表示式在 c/c++ 中,表示式是基於結合律、操作符的優先順序和一組數學計算規則的。要想讓表示式在 32 位和 64 位系統上都可以正確工作,請注意以下規則:

賦值由於指標、int 和 long 在 64 位系統上大小不再相同了,因此根據這些變數是如何賦值和在應用程式中使用的,可能會出現問題。下面是有關賦值的一些技巧:

數字常量

16 進製的常量通常都用作掩碼或特殊位的值。如果乙個沒有字尾的 16 進製的常量是 32 位的,並且其高位被置位了,那麼它就可以作為無符號整型進行定義。

例如,常數 oxffffffffl 是乙個有符號的 long 型別。在 32 位系統上,這會將所有位都置位(每位全為 1),但是在 64 位系統上,只有低 32 位被置位了,結果是這個值是 0x00000000ffffffff。

如果我們希望所有位全部置位,那麼一種可移植的方法是定義乙個有符號的常數,其值為 -1。這會將所有位全部置位,因為它採用了二進位制補碼演算法。

long x = -1l;

可能產生的另外乙個問題是最高位的設定。在 32 位系統上,我們使用的是常量 0x80000000。但是可移植性更好的方法是使用乙個位移表示式:

1l << ((sizeof(long) * 8) - 1);

endianism

endianism 是指用來儲存資料的方法,它定義了整數和浮點資料型別中是如何對位元組進行定址的。

little-endian 是將低位位元組儲存在記憶體的低位址中,將高位位元組儲存在記憶體的高位址中。

big-endian 是將高位位元組儲存在記憶體的低位址中,將低位位元組儲存在記憶體的高位址中。

表 3 給出了乙個 64 位長整數的布局示例。

表 3. 64 位 long int 型別的布局

低位址高位址little endian

byte 0

byte 1

byte 2

byte 3

byte 4

byte 5

byte 6

byte 7

big endian

byte 7

byte 6

byte 5

byte 4

byte 3

byte 2

byte 1

byte 0

例如,32 位的字 0x12345678 在 big endian 機器上的布局如下:

表 4. 0x12345678 在 big-endian 系統上的布局

記憶體偏移量01

23記憶體內容

0x12

0x34

0x56

0x78

如果將 0x12345678 當作兩個半字來看待,分別是 0x1234 和 0x5678,那麼就會看到在 big endian 機器上是下面的情況:

表 5. 0x12345678 在 big-endian 系統上當作兩個半字來看待的情況

記憶體偏移量02

記憶體內容

0x1234

0x5678

然而,在 little endian 機器上,字 0x12345678 的布局如下所示:

表 6. 0x12345678 在 little-endian 系統上的布局

記憶體偏移量01

23記憶體內容

0x78

0x56

0x34

0x12

將 MFC 應用程式移植到 Linux

第一種方法 找乙個類似mfc框架的程式庫。您可能仍然在維護用微軟基礎類庫 microsoft foundation classes mfc 構建的舊的 windows 應用程式,而現在卻有客戶要求 linux 版本,該怎麼辦呢?在您的團隊中可能有技術熟練的 mfc 開發人員,但如何達到加速 linu...

將應用程式移植到uCLinux下時需要注意的問題

將應用程式移植到uclinux下時,需要注意有以下限制 uclibc中不帶有pthread庫,要進行多執行緒程式設計,只能選擇select函式。uclinux系統中由於記憶體管理的問題,沒有fork 函式,用vfork 代替,即uclinux系統中沒有真正的fork,多程序實際是使用vfork實現的...

將 Win32 程式移植到 Linux

分類 c c c linux shell 2011 03 23 17 01 2899人閱讀 收藏舉報 linux windows 平台service 指令碼程式設計 對於這個問題,網上已經有很多資料給予了介紹,但是相比於這些資訊,本文立足於個人的實踐,將內容具體到開發環境和源 我覺得還是有很多值得總...