Gra*_*yer 7 c inline linker-errors
简单的问题:
给出以下程序:
#include <stdio.h>
inline void addEmUp(int a, int b, int * result)
{
if (result) {
*result = a+b;
}
}
int main(int argc, const char * argv[])
{
int i;
addEmUp(1, 2, &i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我收到链接器错误...
Undefined symbols for architecture x86_64:
_addEmUp", referenced from:
_main in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)
看起来似乎没有费心去编译它.
它不应该是static,我不会想,基于我读过的内容:
链接器错误内联函数(因为这是在一个不同的对象,并处理2个定义而不是零)
这是一个相关的链接,但它是c ++,我认为在std C中将代码放入头文件中是不错的做法:
内联函数链接器错误
编译信息:
cc --version
Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn)
Target: x86_64-apple-darwin12.3.0
Thread model: posix
Run Code Online (Sandbox Code Playgroud)
编译示例:
# cc main.c
Undefined symbols for architecture x86_64:
"_addEmUp", referenced from:
_main in main-sq3kr4.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocatio
Run Code Online (Sandbox Code Playgroud)
Dan*_*her 11
第6.7.4节第7段说:
具有内部链接的任何函数都可以是内联函数.对于具有外部链接的函数,以下限制适用:如果使用
inline函数说明符声明函数,则它也应在同一转换单元中定义.如果转换单元中函数的所有文件范围声明都包含inline函数说明符extern,则该转换单元中的定义是内联定义.内联定义不提供函数的外部定义,也不禁止另一个转换单元中的外部定义.内联定义提供了外部定义的替代,翻译器可以使用该定义在同一翻译单元中实现对该功能的任何调用.未指定对函数的调用是使用内联定义还是使用外部定义.
您的文件不包含外部定义addEmUp,并且编译器选择在调用中使用外部定义main.
提供外部定义,或将其声明为static inline.