【问题标题】:Compiling C with Objective-C and duplicate symbol linker error (iPhone related)使用 Objective-C 编译 C 和重复符号链接器错误(与 iPhone 相关)
【发布时间】:2011-07-01 20:23:13
【问题描述】:

我有以下文件 testf.h:

#ifndef TESTF_H_
#define TESTF_H_
int test(int what){
    return what;
}
#endif

我在 TestAppDelegate.h 中包含/导入了它(用于我的 xcode 项目中的其他 .m 文件)。我得到一个重复的符号错误。如果我在一个 .m 文件中包含/导入了 testf.h,而该文件从未包含/导入到其他文件中,那么它可以正常工作。所以看起来#ifndef/#define/#endif 没有效果。有没有办法解决这个问题?

谢谢

【问题讨论】:

    标签: iphone objective-c c xcode ios4


    【解决方案1】:

    这是一个函数定义,它属于 c、cpp 或 m 文件。

    这个#defines 的流行技巧将保护您免受编译器错误的影响(通常是为了避免循环#include 依赖项。)它不会防止链接器错误。这正是人们将声明放在 h 文件中并将定义放在 c(或 m)文件中的原因。

    【讨论】:

    • 将我的定义移至 c 文件,并严格保留 h 用于声明。工作。谢谢先生。
    【解决方案2】:

    在头文件中包含函数定义(而不是声明)通常是个坏主意,现在您知道为什么了。您需要两个单独的文件,标题如下所示:

    #ifndef TESTF_H_
    #define TESTF_H_
    extern int test(int);
    #endif
    

    然后是 .c 文件(或者如果您想使用 Objective-C 而不是纯 C,则可能是 .m 文件),如下所示:

    int test(int what) {
        return what;
    }
    

    头文件会让编译器知道test是什么,它返回什么,应该接受什么参数;这些信息足以让编译器安排对test 的调用;这实际上比编译器需要的信息更多,但我们中的一些人喜欢我们的编译器进行一些错误检查。 C 源文件将(在编译成目标文件后)让链接器知道test 符号解析为什么代码。

    现在,您将得到多个全局可见的 test 符号实例,每个包含您的 testf.h 的文件都有一个。

    【讨论】:

      【解决方案3】:

      对于一个简单的函数,另一个选项是声明它inline

      inline int cNorm(float _amp) {
        return 42;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-13
        • 2013-09-20
        • 1970-01-01
        • 2011-02-26
        • 1970-01-01
        • 2013-10-28
        • 2016-08-19
        • 1970-01-01
        相关资源
        最近更新 更多