跨平台相關

2021-08-28 22:51:04 字數 4376 閱讀 7889

二者區別:

strdup是posix,_strdup是windows特定。 在unix上,使用的strdup。

在不同作業系統的lib庫名字不同的,為了讓程式可以多平台,需要在巨集定義中判斷當前執行作業系統和編譯器的型別,動態調整。

windows:   win32   _win32

linux: linux __linux __linux__

solaris: __sun

borland:             __borlandc__

codeplay vectorc: __vectorc__

digital mars: __dmc__

gnu: __gnuc__

intel: __intel_compiler

microsoft: _msc_ver

pathscale: __pathscale__

symantec: __symantecc__

watcom: __watcomc__

linux_x32:  __i386__

linux_x64: __x86_64__

windows: _win64 定義了就是x64 沒定義就是x32

x86: _m_ix86 __intel__ __i386__

x86-64: _m_x64 __x86_64__ __amd64

ia64: __ia64__

dec alpha: __alpha__

motorola power pc: __powerpc__

any little endian: __little_endian__

any big endian: __big_endian__

#include

pthread並非linux系統的預設庫,而是posix執行緒庫,在linux中將其作為乙個庫來使用,因此加上 -lpthread(或-pthread)以顯式鏈結該庫。函式執行錯誤資訊作為返回值返回。

int

pthread_create

(pthread_t *tidp,

const pthread_attr_t *attr,

(void*)

(*start_rtn)

(void*)

,void

*arg)

;

第乙個引數為指向執行緒識別符號的指標。

第二個引數用來設定執行緒屬性。

第三個引數是執行緒執行函式的起始位址。

最後乙個引數是執行函式的引數。

int

pthread_join

(pthread_t thread,

void

**retval)

;

#include

#include

#include

#include

void

*fun1

(void

*arg)

pthread_mutex_unlock

(temp)

;return0;

}void

*fun2

(void

*arg)

intmain()

#include

#include

#include

pthread_mutex_t mutex = pthread_mutex_initializer;

/*初始化互斥鎖*/

pthread_cond_t cond = pthread_cond_initializer;

/*初始化條件變數*/

void

*thread1

(void*)

;void

*thread2

(void*)

;int i=1;

intmain

(void

)void

*thread1

(void

*junk)

pthread_mutex_unlock

(&mutex)

;/*解鎖互斥量*/

printf

("thread1: unlock %d/n/n"

,__line__);

sleep(1

);}}

void

*thread2

(void

*junk)

pthread_mutex_unlock

(&mutex)

;printf

("thread2: unlock %d/n/n"

,__line__);

sleep(1

);}}

原文:

推薦第二種方法

1、使用gcc 的c++ visibility 支援。

把__attribute__ ((visibility (「default」))) 放置在你希望匯出的struct,class,function的宣告處,然後修改你的gcc構建引數,使用 -fvisibility=hidden 引數編譯每乙個源**檔案。gcc編譯源**檔案的visibility預設屬性是public,所以預設所有符號都匯出來了,設定為hidden後然後在需要匯出的地方加__attribute__ ((visibility (「default」))),以達到控制匯出符號的目的。在跨平台**的編寫中,常使用下面類似的巨集定義來簡化上述過程。

#if defined _win32 || defined __cygwin__

#ifdef building_dll

#ifdef __gnuc__

#define dll_public __attribute__ ((dllexport))

#else

#define dll_public __declspec(dllexport) // note: actually gcc seems to also supports this syntax.

#endif

#else

#ifdef __gnuc__

#define dll_public __attribute__ ((dllimport))

#else

#define dll_public __declspec(dllimport) // note: actually gcc seems to also supports this syntax.

#endif

#endif

#define dll_local

#else

#if __gnuc__ >= 4

#define dll_public __attribute__ ((visibility ("default")))

#define dll_local __attribute__ ((visibility ("hidden")))

#else

#define dll_public

#define dll_local

#endif

#endif

extern "c" dll_public void function(int a);

class dll_public someclass

static void foo(int a);

};

2、使用鏈結引數 --retain-symbols-file 控制靜態符號表,–version-script 控制動態符號表,後面都是接含有匯出符號的檔案的名字。這兩個引數在移植windows下的動態庫很有用,windows下的def檔案能控制匯出符號,我們可以在linux下的構建指令碼中解析def生成乙個匯出符號檔案,然後作為retain-symbols-file,version-script的引數。

編譯鏈結方法:gcc a1.c -shared -o liba1.so -wl,–retain-symbols-file=a1.sym -wl,–version-script=a1.map

a1.sym寫法:控制.symtab節

func_1

func_3

a1.map寫法:控制.dynsym節

;

一般編譯會加-s將.symtab節刪除掉,過刪除的話就可以不加a1.sym

跨平台工具

作圖 做好圖 inkspace 向量圖 inpaint 提供類似 photoshop 的基礎功能,簡單易用 imagemagick pdf 處理 1.small pdf 2.i love pdf 編輯器1.sublime text 2.typora markdown 3.texmaker latex...

開發HTML5跨平台遊戲相關經驗

我們剛成立gamezee的時候,行業中許多人都對html5抱有成見,就算是一些對其較為樂觀的人士也只是說,html5將是未來發展潮流,但目前還不夠成熟和穩定,無法製作出當前主導社交遊戲領域的ville型別flash遊戲。我們剛成立gamezee的時候,行業中許多人都對html5抱有成見,就算是一些對...

討論 關於跨平台

跨平台是軟體的乙個重要指標。一般程式可分為平台無關和平台相關兩部分,平台相關部分主要涉及外圍裝置 如串列埠 鍵盤 滑鼠 lcd等 和作業系統api 如定時器 互斥鎖 檔案系統操作 執行緒操作等 除了程式本身的跨平台需求外,還有種應用是對目標機的模擬,例如在pc上模擬一些嵌入式平台的應用,一來可以方便...