我正在为我的GUI API添加跨平台剪贴板支持。我设法使其可以在Windows上很好地工作,现在我正在使用OSX。

我已经按需要使用了功能,但是文件是.mm。因此,当人们编译我的GUI的OSX版本时,他们现在需要链接到 cocoa 库。

有没有人在使用cmake并将c++与Objective-c混合时如何链接到 cocoa 的经验?

谢谢

最佳答案

有一些编译器开关,您可以传递给gcc或clang来启用Objective 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

如果希望您的应用程序与Snow Leopard兼容,请指定10.6。您还需要将sysroot选项传递给gcc或clang,以使他们知道要针对哪个版本的SDK进行编译:
gcc -ObjC++ -mmacosx-version-min=10.6 --sysroot=/Developer/SDKs/MacOSX10.7.sdk

玩具用arch选项指定要构建的架构
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并使用clang进行编译时,可以使用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

希望这可以帮助。

关于c++ - 使用CMake链接到 cocoa 库(C++与Objective-C混合),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7827758/

10-11 22:40
查看更多