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. 「+」ボタンを 1 回クリックして、各フレームワークを追加します。

Xcode を使用してフレームワークを追加すると、ビルドは成功します。ただし、準備スクリプト「prepmac.sh」が再度実行されると、フレームワークが失われ、ビルドが失敗します。

PluginConfig.cmake と Mac/projectDef.cmake を編集して、いくつかの方法で FireBreath を介してフレームワークを追加しようとしましたが、CMakeLists.txt を変更することも検討しましたが、これはあまり有望ではないようです。

2 つのファイル内で次のステートメントをさまざまな組み合わせで試しました.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

解決策: Taxlian からのアドバイスに基づく解決策は、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})

これは、「add_mac_plugin」呼び出しののどこかにMac/projectDef.cmakeファイルにある必要があることに注意してください。

于 2013-02-12T16:27:51.780 に答える