FireBreath Mac OS X基础

时间:2013-02-12 05:51:59

标签: c++ macos firebreath browser-plugin

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

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

请帮我解决此链接错误。

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

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

  1. 在项目导航器中选择项目。
  2. 选择目标。
  3. 选择“构建阶段”选项卡。
  4. 打开'链接二进制文件库'扩展器(您可能必须使用 '添加构建阶段')。
  5. 单击“+”按钮一次以添加每个框架。
  6. 通过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
    

    解决方案: 基于taxilian的建议,解决方案是在Mac / projectDef.cmake中正确指定正确的Frameworks并完全删除构建目录并使用prepmac.sh脚本从头开始重新构建。

1 个答案:

答案 0 :(得分:2)

简单地执行find_library不足以使其链接;您还需要将其添加到target_link_libraries调用中。你还应该确保你的案例与图书馆本身相匹配;我不知道在mac上是否重要,但如果它是一个区分大小写的文件系统(并且可以在mac上使用),这是很好的做法。

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

您可以在Using Librariesfirebreath.org页面上找到有关如何正确执行此操作的详细信息。尝试这样的事情:

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

请注意,这需要在“add_mac_plugin”调用之后的某处的Mac / projectDef.cmake文件中。