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

Posted

技术标签:

【中文标题】使用 CMake 链接到可可库(C++ 与 Objective-C 混合)【英文标题】:Linking to cocoa libraries with CMake (C++ intermixed with Objective-C) 【发布时间】:2011-10-19 20:33:57 【问题描述】:

我正在为我的 gui api 添加跨平台剪贴板支持。我设法让它在 Windows 上很好地工作,现在我正在使用 OSX。

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

在使用 cmake 并将 c++ 与 Objective-c 混合时,有没有人知道如何链接到可可?

谢谢

【问题讨论】:

【参考方案1】:

您可以将一些编译器开关传递给 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

Toy 使用 arch 选项指定要构建的架构

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

如果您单独调用链接器 ld,则需要将 sysrootlib 选项传递给 ld。要生成动态链接库,请将 dylib 选项传递给 ld。如果您将动态库传递给 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

希望这会有所帮助。

【讨论】:

以上是关于使用 CMake 链接到可可库(C++ 与 Objective-C 混合)的主要内容,如果未能解决你的问题,请参考以下文章

cmake 将外部库与 IMPORT_SONAME ro IMPORT_LOCATION 链接

CMake 访问 SWIG 并将 java 库链接到现有 C++ 项目的问题

NDK 与 cmake 的链接库

是否可以将 cmake 项目链接到子项目?

自定义库名称与系统库相同时的CMake循环依赖错误

CMake:将第三方库链接到项目库