为什么在Xcode中静态函数可以消除未定义符号?

7

我正在尝试使用I/O kit,并已正确链接到I/O kit。

当我在I/O kit中使用一个函数并且没有在静态函数内调用它时,我会收到以下错误: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)

你能贴出完整的错误信息列表吗?例如,它是否抱怨符号IORegisterForSystemPower? - jman
我已添加错误信息。请参见上方。 - David
1个回答

2

我找到了一个情景来解释为什么这种情况会发生。如果静态函数从未被调用,您将不会遇到链接时的错误。

例如,我写了一个简单的c文件,其中包含此函数,而undef_foobar没有被定义:

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

现在,如果从我的main()调用foobar(),我会收到以下错误:
Undefined symbols for architecture x86_64:
  "_undef_foobar", referenced from:

如果在该c文件中根本没有调用该函数,那么就不会出现链接器错误。

我尝试了你的示例,Xcode警告我未定义的函数Implicit declaration of function "undef_foobar" is invalid in C99。你介意尝试链接并调用I/O kit中的函数,看看是否会出现相同的链接器问题吗? - David

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接