二者區別:
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上模擬一些嵌入式平台的應用,一來可以方便...