CMake MacOS 框架没有正确链接?

CMake MacOS frameworks not being linked properly?

使用 CLion IDE 和 CMake 用 c++ 和几个 objective-c++ classes.

编译我的项目

我的问题出现是因为我需要在我的项目中包含 CoreFoundation,以便我的 class 在 .mm 文件中继承 NSObject

经过大量挖掘,我想我找到了将 MacOS 框架(CoreBluetooth、CoreFoundation 等)与 cmake 链接起来的现代 CMake 方法。

下面的代码是在我的 Cmakelists.txt 文件中查找和链接 MacOS 框架的现代方法:

target_link_libraries(project_name PUBLIC stdc++ "-framework CoreBluetooth"
                                            "-framework Foundation"
                                            "-framework CoreFoundation"
    objc)

加载 cmake 不会引发任何错误,但是当我尝试 import 文件(在我的 .cpp 或 .mm 文件中)时,IDE 说找不到 CoreBluetooth和基金会图书馆。

不确定我是否漏掉了任何明显的东西。如有任何帮助,我们将不胜感激!

好吧,经过几次徒劳无功,层层挖掘,我终于找到了解决办法。我打印出 CoreFoundation 的位置以确保它被正确找到并且目录是好的:

find_library(FoundationLib CoreFoundation)
message("LIB: ${FoundationLib}")

-> /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/Foundation.framework 好吧,我几乎可以肯定正在正确加载。现在我深入挖掘并破坏了我的代码,发现 CLion 接受其他扩展名,例如 .h++ 和 .hm

.hm 看起来非常类似于 .h,而且我知道 .m 扩展名表示一个 objective c 文件,所以这一定意味着我应该使用 .hm 来表示一个 objective-c header。所以我用 .hm 扩展名重命名了我的 header,它现在可以工作了。我认为这是 CLion 特有的,没有在任何地方记录。

回顾:在 CLion 上将您的 objective c header 从 .h -> .hm

重命名

并且如果您的 header 是 objective c++ header,请从 .h 更改为 -> .hmm

最后回顾:我将 header 文件从 .hm 和 .hmm 改回 -> .h,它们仍然有效。所以我的问题的最终答案是关于 CLion 你必须暂时将 objective c++ headers 设置为 .hmm 和 .hm 然后你将它们设置回 .h