跨平台是什麼意思呢?先了解一下平台的概念以及平台的差異。我們知道一個VC編譯出來的*.exe是不能在Linux運行的,不能運行的原因可以概括為以下幾個方面:
1. 文件的結構與格式
可執行程序是按定義好的格式來組織的, Microsoft 他 GNU對程序文件的定義是不一樣的,如GNU使用 ELF格式定義。也就是說,當操作系統(Windows/Linux)試圖把一個程序文件加載到內存裡准備運行的時候,它可能會發現這個文件格式不對。
2. 依賴庫
程序的最基本的運行庫是C runtime,比如你調用的printf就是C庫的接口,這間味著你發布的程序是依賴C的動態庫的, Linux上叫libc.so
3. 指令集與大小端
最常見的指令集用Intel, ARM 指令集,如果你的程序是為Intel PC編譯的,那麼這個程序就不可能在ARM平台上運行。(也許它們都是運行著Linux)。但是指令集都不一樣的話,怎麼能夠運行呢?
通過上面的討論,可以發現跨平台好像是一件不能完成的任務。那麼為什麼我們還能經常見到跨平台這個詞呢,JAVA, ACE ,QT等等,它們都是跨平台的。那麼它們是怎麼跨平台的呢?
C++11新特性:Lambda函數(匿名函數) http://www.linuxidc.com/Linux/2013-12/93367p2.htm
C++ Primer Plus 第6版 中文版 清晰有書簽PDF+源代碼 http://www.linuxidc.com/Linux/2014-05/101227.htm
讀C++ Primer 之構造函數陷阱 http://www.linuxidc.com/Linux/2011-08/40176.htm
讀C++ Primer 之智能指針 http://www.linuxidc.com/Linux/2011-08/40177.htm
讀C++ Primer 之句柄類 http://www.linuxidc.com/Linux/2011-08/40175.htm
C++11 獲取系統時間庫函數 time since epoch http://www.linuxidc.com/Linux/2014-03/97446.htm
C++11中正則表達式測試 http://www.linuxidc.com/Linux/2012-08/69086.htm
第一種跨平台的方式:JAVA
首先說JAVA。JAVA這個東西跨平台最徹底,同時也可以說它最“不跨平台”。JAVA編譯出來的class文件並不能直接在目標平台上運行,它必須由一個叫java.exe /java的程序解釋執行。顯然,在不同的平台上這個java解釋程序是完全不一樣的。最基本的,windows上的解釋程序叫java.exe,linux上的叫java,是完全不的兩個文件。這件事說白了就是,你寫一個腳本,交給2個不同的程序去運行,運行結果一致。
如果對比一下,連perl, python這種腳本語言也是跨平台的。它們和JAVA“跨”的方式本質上一樣。Java跨的方式更隱蔽一些,它是先把 .java文件編譯成了中間指令集.class,再解釋執行這個中間指令集的。
第二種跨平台的方式: 仿QT
我就直接說我們可以怎麼跨平台吧。簡單地說,就是寫2個平台相關的代碼,屏蔽了平台差異。在業務代碼裡,完全不要用平台相關的代碼。
以線程為例,windows/linux下實現線程的方式是完全不一樣的。於是我們先定義一個線程類。
#ifndef _OSAPI_THREAD_H
#define _OSAPI_THREAD_H
/* presented by 阿發你好 */
class OS_Thread
{
public:
OS_Thread();
virtual ~OS_Thread();
// 創建並啟動
virtual int Run();
// 等待和收回資源
static void Join(OS_Thread* thrd);
// Sleep函數
static void Msleep(int ms);
static void Sleep(int s);
public:
virtual int Routine() = 0;
private:
void* m_Priv;
};
#endif
也就是說,無論你是XXX平台還是YYY平台,總該是有線程支持的。所以麻煩你先按照上述接口實現一個線程類吧。我在業務代碼裡要使用線程的時候,就使用線程接口,完全不使用平台相關的接口了。
#include "../osapi/Thread.h"
class MyThread : public OS_Thread
{
public:
int Create()
{
m_quitflag = false;
run();
return 0;
}
void Destroy()
{
m_quitflag = true;
Join(this);
}
private:
/* 線程函數 */
virtual int Routine()
{
while(!m_quitflag)
{
printf("helloafa!\n");
OS_Thread::msleep(500);
}
return 0;
}
private:
bool m_quitflag;
};
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-06/103104p2.htm