Linux编译错误: undefined reference to some function

【问题】
  编译错误: undefined reference to some function 表明函数的调用方无法获取到函数的定义信息,对于一个模块而言,极有可能是因为被调用函数没有被成功的包含。本文末尾将提供一个有效判断函数是否存在于某一模块的方法。
  Linux C模块开发中,一般情况下一个模块至少有以下四个文件组成:

  1. 头文件 fun.h
  2. 源文件 fun.c
  3. 模块定义文件 fun.def
  4. Makefile文件 fun.makefile

  现有一个需求,需要在上述模块中添加一个新的接口,该接口针对业务A,我们可以将该接口命名为fun_method_a(…)。


【解决方法】
  因该接口是随着模块fun提供给外部使用,故其在头文件中的声明不能使用static关键字而需要使用extern关键字。细节而言共有以下四点:

  1. 头文件中添加声明
extern void fun_method_a(...); 
  1. 源文件中添加定义
void fun_method_a(...) {
   // implemention
} 
  1. 模块定义文件中添加函数名称
fun_method_a
  1. Makefile文件中添加规则

【问题验证】
  待上述模块重新编译后,如何验证新添加的接口已经被包含在库文件 fun.o中?

/*  Query whether the new added method was included */
[root@test]# nm -g --defined-only fun.o | grep fun_method_a
00000000000008a9 T fun_method_a

  此外,命令 nm 也可以用来查询Linux下的.o, .a, .so文件中包含的函数信息!
  通过上述方法,可以在最小范围内首先确定新添加接口是否已被成功包含。设想你有一个大的项目,一次编译需要耗费几个小时,倘若模块中添加接口失败(编译成功,但是由于条件编译未成功执行、未更新def文件等),那该错误需要等到一次编译结束时才会被发现,白白浪费大量时间!

你可能感兴趣的:(后端开发,Undefined,reference,未定义引用)