歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Linux 可移植性(軟件可移植)

Linux可移植性,如何才能實現軟件預期的靈活性.不同硬件和軟件平台用戶都可以不做任何修改或者只做極少的修改就可以使用軟件.

常見的可移植性需求有:

a.平台之間的可移植,例如unix和linux以及mac

b.linux不同發行版之間

使用可移植函數庫並充分使用各種自動配置工具編寫的linux可以滿足以上要求. 

1.抽象層

在linux內核之上穿件標准化函數庫,例如glibc.內核只負責處理繁瑣的硬件細節.系統工具可以繞開函數庫直接使用內核的接口. 

2.linux標准化

a.LSB (linux標准化規范 Linux Standards Base)

主要基於POSIX以及單一UNIX規范.

它的目標是:在符合LSB特定版本要求的指定主機架構上,在不同的發行版和同一發行版的不同版本之間提供正真的二進制兼容.

LSB是一個二進制ABI標准.它使用rpm包作為可移植軟件包格式概念基礎,並對LSB兼容包的命名和內部內容就行了約束.

3.linux軟件包開發注意事項

當編寫自己的應用程序時,需要在設計中考慮將依賴於哪些外部軟件和函數庫,哪些軟件將由自己交付,如何支持不滿足應用程序要求的發行版.

4.可移植的源代碼

以上都是linux可移植的泛泛之談.代碼可移植才最重要.

在linux編寫的軟件不僅僅要運行在相同平台發行版之間可以二進制兼容,還應該在大多數提供正確函數庫和必備條件的系統中成功編譯.編譯過程必須小心的確定不同軟件環境之間的差異.

為了輔助不同編譯環境之間的源代碼級的可移植性,人們創建了gnu的自動化工具autotools.autoconf,autoheader,libtool,automake等許多腳本和工具一起工作構成gnu編譯系統.這個工具自動運行一系列的測試以獲得對用戶所處硬件和軟件環境的理解,然後再確定是否可能在這一特定的軟件環境中編譯軟件.當准備號合適的源代碼集之後,就可以使用你可能早已熟悉的configure,make,make install,來編譯軟件了.

a.gnu自動化工具

我們這裡組織一個案例hello.c,庫libhello,以及configure判定大端小端

hello.c:

#include "hello.h"
int main()
{
        print_message("hello world!\n");

#ifdef WORDS_BIGENDIAN
        printf("this is a big endian\n");
#endif
        return 0;
}

help.c:

include <stdio.h>

void print_message(char *msg)
{
        printf("the message is %s \n",msg);
}

hello.h:

void print_message(char *msg)

執行以下命令:

gcc -shared -fPIC -o libhello.so help.c

gcc -lhello -L. hello.c

export LD_LIBRARY_PATH=`pwd`

./hello

1)gnu autoconf

configure用於建立包含一個特定系統動態信息的頭文件,這些動態信息用於源代碼測試.例如,一個編譯周期通常會創建一個頭文件config.h.它包含很多#define聲明對應已經經過測試的特性.如果gnu configyre確定本地的環境適合編譯軟件,那麼這些定義將有助於增加軟件的靈活性.因為他們允許必要的時候進行條件代碼編譯.

以下為一個configure.in的例子:

##這一句是autoconf需要的最低版本

AC_PREREQ([2.68]) 

##設置軟件包的名字,版本號,以及作者郵箱

AC_INIT([hello], [1.0], [[email protected]])

##以下是設置包含進configure中的特征和測試需要.

#設置主機編譯還是為另一個目標系統編譯

AC_CANONICAL_SYSTEM

#測試目錄下是否存在hello.c,用於確保用戶在正確的目錄下.


AC_CONFIG_SRCDIR([hello.c])
AC_CONFIG_HEADERS([config.h])
# Checks for programs.測試是否存在c編譯器
AC_PROG_CC

#測試標准頭文件的可用性

AC_HEADER_STDC

#測試大端小端

AC_C_BIGENDIAN

#測試其他的頭文件

AC_CHECK_HEADERS

#指定gnu autoconf運行之後輸出的文件

AC_OUTPUT(makefile)

最後執行autoconf

 configure腳本將從configure.in文件中自動生成基於可移植的shell代碼. 

Copyright © Linux教程網 All Rights Reserved