使用 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 链接