0

我的 FireBreath 插件的 Mac 版本出现链接错误,如下所示:

Undefined symbols for architecture x86_64:
  "_IOIteratorNext", referenced from:
      MyFunction(...) in MyFile.o

请帮我解决这个链接错误。

我有类似的错误"_IOObjectRelease", "_IORegistryEntryCreateCFProperty", "_IORegistryEntryGetParentEntry", "_IOServiceGetMatchingServices", "_IOServiceMatching", and "_kIOMasterPortDefault"。这让我相信我需要包含 IOKIT 和 COREFOUNDATION 框架。

我已经得出结论,这些是我需要的框架,因为我可以通过像这样直接将它们添加到 Xcode 来暂时使构建成功:

  1. 在项目导航器中选择项目。
  2. 选择目标。
  3. 选择“构建阶段”选项卡。
  4. 打开“Link Binaries With Libraries”扩展器(您可能必须使用“Add Build Phase”)。
  5. 单击“+”按钮一次以添加每个框架。

通过 Xcode 添加框架后,构建成功。但是,一旦再次运行准备脚本“prepmac.sh”,框架就会丢失并且构建失败。

我已经尝试通过编辑 PluginConfig.cmake 和 Mac/projectDef.cmake 以多种方式通过 FireBreath 添加框架,甚至考虑修改 CMakeLists.txt,但这似乎不太有希望。

我在这两个.cmake文件中尝试了以下各种组合的语句,但我不确定将它们放在哪里:

find_library(IOKIT_FRAMEWORK IOKit)
message("Finding library IOKit: ${IOKIT_FRAMEWORK}")

find_library(COREFOUNDATION_FRAMEWORK CoreFoundation)
message("Finding library CoreFoundation: ${COREFOUNDATION_FRAMEWORK}")

target_link_libraries(${PROJECT_NAME}
    ${COREFOUNDATION_FRAMEWORK}
    ${IOKIT_FRAMEWORK}
    ${PLUGIN_INTERNAL_DEPS}
)

似乎没有任何更改会更改构建日志。当然,我正在使用“prepmac.sh”在更改之间生成项目,其中新的“消息”语句报告:

Finding library IOKit: /System/Library/Frameworks/Cocoa.framework
Finding library CoreFoundation: /System/Library/Frameworks/CoreFoundation.framework

解决方案:根据出租车司机的建议,解决方案是在 Mac/projectDef.cmake 中正确指定正确的框架,并完全删除构建目录并使用 prepmac.sh 脚本从头开始重新制作。

4

1 回答 1

2

仅仅做一个 find_library 是不够的。您还需要将其添加到 target_link_libraries 调用中。此外,您应该真正确保您的案例与库本身相匹配;我不知道这在 mac 上是否重要,但如果它是一个区分大小写的文件系统(是的,这可能在 mac 上),这是一个很好的做法。

框架的正确案例是“IOKit”和“CoreFoundation”

您可以在firebreath.org上的使用库页面上找到有关如何正确执行此操作的更多信息。尝试这样的事情:

find_library(IOKIT_FRAMEWORK IOKit)
find_library(COREFOUNDATION_FRAMEWORK CoreFoundation)
target_link_libraries(${PROJECT_NAME} ${COREFOUNDATION_FRAMEWORK} ${IOKIT_FRAMEWORK})

请注意,这需要位于您的 Mac/projectDef.cmake 文件中,位于“add_mac_plugin”调用之后的某个位置。

于 2013-02-12T16:27:51.780 回答