使用 CMake 链接到 cocoa 库(C++ 与 Objective-C 混合)

jma*_*erx 2 c++ objective-c cmake

我正在努力为我的 gui api 添加跨平台剪贴板支持。我设法让它在 Windows 上运行良好,现在我在 OSX 上运行。

我已经让函数按照我想要的方式工作,但文件是 .mm 。因此,当人们编译我的 gui 的 OSX 版本时,他们现在需要链接到 cocoa 库。

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

谢谢

Bri*_*man 5

您可以将一些编译器开关传递给 gcc 或 clang 来启用 Objective C 或 Objective C++ 应用程序的编译:

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

clang -ObjC MySourceFile.m 
clang -ObjC++ MySourceFile.mm
Run Code Online (Sandbox Code Playgroud)

您可以使用以下选项指定应用程序可以运行的最低 MacOSX 版本:

gcc -ObjC++ -mmacosx-version-min=10.6
Run Code Online (Sandbox Code Playgroud)

如果您希望您的应用程序与 Snow Leopard 兼容,请指定 10.6。您还需要将 sysroot 选项传递给 gcc 或 clang,让它们知道要编译哪个版本的 SDK:

gcc -ObjC++ -mmacosx-version-min=10.6 --sysroot=/Developer/SDKs/MacOSX10.7.sdk
Run Code Online (Sandbox Code Playgroud)

玩具通过 arch 选项指定要构建的架构

gcc -ObjC++ -mmacosx-version-min=10.6 --sysroot=/Developer/SDKs/MacOSX10.7.sdk -arch x86_64
Run Code Online (Sandbox Code Playgroud)

如果单独调用链接器 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
Run Code Online (Sandbox Code Playgroud)

要链接到 Cocoa 框架,您可以将框架选项作为链接器选项传递给 gcc 和框架的名称:

gcc -dynamiclib -ObjC++ -mmacosx-version-min=10.6 --sysroot=/Developer/SDKs/MacOSX10.7.sdk -arch x86_64 -Wl,-framework,Cocoa
Run Code Online (Sandbox Code Playgroud)

如果您使用 C++ 标准库,则需要将其指定为链接器选项

-Wl,stdc++
Run Code Online (Sandbox Code Playgroud)

当部署到 MacOSX 10.7 并使用 clang 编译时,您可以使用 libc++ C++ 标准库。您将选项传递给编译器和链接器:

-stdlib=libc++ -Wl,c++ 
Run Code Online (Sandbox Code Playgroud)

因此,要从源代码生成一个链接到 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
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。