2011-10-19 53 views
2

我正在爲我的gui api添加跨平臺剪貼板支持。我設法很好地在Windows上工作,現在我正在使用OSX。使用CMake鏈接到可可庫(C++與Objective-C混合)

我已經得到了我想要的功能,但文件是.mm。因此,當人們編譯我的GUI的OSX版本時,他們現在需要鏈接到可可庫。

有沒有人有如何使用cmake和混在C++與Objective-C的時候鏈接到可可的經驗?

感謝

回答

3

有其傳遞給GCC或鏗鏘,使目標C或Objective C++應用程序的編譯一些編譯器開關:

gcc -ObjC MySourceFile.m 
gcc -ObjC++ MySourceFile.mm 

clang -ObjC MySourceFile.m 
clang -ObjC++ MySourceFile.mm 

您指定的MacOSX的最低版本上您的應用程序可以使用下列選項運行:

gcc -ObjC++ -mmacosx-version-min=10.6 

指定10.6,如​​果你要是想你的應用程序能與雪豹兼容。您還需要通過SYSROOT選項GCC或鐺,讓他們知道編譯哪個版本的SDK反對:

gcc -ObjC++ -mmacosx-version-min=10.6 --sysroot=/Developer/SDKs/MacOSX10.7.sdk 

玩具明確創建架構與拱選項

gcc -ObjC++ -mmacosx-version-min=10.6 --sysroot=/Developer/SDKs/MacOSX10.7.sdk -arch x86_64 

如果單獨調用鏈接器ld,則需要將sysrootlib選項傳遞給ld。爲了生成一個動態鏈接的庫,你將dylib選項傳遞給ld。如果您將dynamiclib傳遞給gcc或clang,這將傳遞給ld。

gcc -dynamiclib -ObjC++ -mmacosx-version-min=10.6 --sysroot=/Developer/SDKs/MacOSX10.7.sdk -arch x86_64 

要連結對Cocoa框架傳遞框架選項作爲鏈接器選項gcc和框架的名字:

gcc -dynamiclib -ObjC++ -mmacosx-version-min=10.6 --sysroot=/Developer/SDKs/MacOSX10.7.sdk -arch x86_64 -Wl,-framework,Cocoa 

如果您使用C++標準庫,你將需要指定爲一個連接器選項與

-Wl,stdc++ 

當部署到MacOSX的10.7和鏗鏘可以使用的libC++ C++標準庫編譯。您將一個選項傳遞到編譯器和鏈接器:

-stdlib=libc++ -Wl,c++ 

因此產生從源這是對Cocoa框架鏈接庫,你會做以下使用gcc

gcc -dynamiclib -ObjC++ -mmacosx-version-min=10.6 --sysroot=/Developer/SDKs/MacOSX10.7.sdk -arch x86_64 -o MyLibrary.dylib -Wl,-framework,Cocoa MySourceFile.mm 

希望這有助於。