7

I/O キットを使用しようとしていますが、I/O キットに正しくリンクしています。

I/O キットで関数を使用し、それを静的関数内で呼び出さないと、次のエラーが発生しますUndefined symbols for architecture x86_64

エラーを抑制する例を次に示します

static void test(void)
{
    if (IORegisterForSystemPower(...)) 
    {

    }
}

エラーの原因となる例を次に示します。

void test(void)
{
    if (IORegisterForSystemPower(...)) 
    {

    }
}

なぜこれが起こっているのかについての提案はありますか?

編集:

正確なエラーメッセージは次のとおりです。

Undefined symbols for architecture x86_64:
  "_IORegisterForSystemPower", referenced from:
      _registerNotificaitonUsingIOKit in AppDelegate.o
  "_IONotificationPortGetRunLoopSource", referenced from:
      _registerNotificaitonUsingIOKit in AppDelegate.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
4

1 に答える 1

2

わかりました、これが起こり得るシナリオが 1 つあります。静的関数が呼び出されない場合、そのリンク時エラーは発生しません。

たとえば、この関数を使用して単純な c ファイルを作成しましたundef_foobarが、定義されていません。

static int foobar (void) 
{
    undef_foobar ();
}

foobar()が my から呼び出されるとmain()、次のエラーが表示されます。

Undefined symbols for architecture x86_64:
  "_undef_foobar", referenced from:

関数がこの c ファイル内からまったく呼び出されない場合、リンカー エラーはありません。

于 2011-10-07T07:33:56.277 に答える