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文件等),那该错误需要等到一次编译结束时才会被发现,白白浪费大量时间!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 ARM 架构上编译 X11 库和 XShm 库,并链接到你的程序中,你需要使用 ARM 架构的交叉编译工具链。一些常见的交叉编译工具链包括 Linaro 和 CodeSourcery。 假设你已经安装并配置好了交叉编译工具链,并且已经下载了 X11 库和 XShm 库的源代码,那么你可以按照以下步骤进行交叉编译: 1. 设置交叉编译工具链的环境变量。例如,如果你使用的是 Linaro 工具链,你可以运行以下命令: ``` export CC=arm-linux-gnueabihf-gcc export CXX=arm-linux-gnueabihf-g++ export AR=arm-linux-gnueabihf-ar export LD=arm-linux-gnueabihf-ld ``` 2. 进入 X11 库的源代码目录,运行以下命令进行配置: ``` ./configure --host=arm-linux-gnueabihf --prefix=/path/to/install ``` 其中 `--host` 参数指定了目标架构,`--prefix` 参数指定了安装目录。 3. 运行 `make` 命令进行编译。 4. 进入 XShm 库的源代码目录,运行以下命令进行配置: ``` ./configure --host=arm-linux-gnueabihf --prefix=/path/to/install ``` 其中 `--host` 参数指定了目标架构,`--prefix` 参数指定了安装目录。 5. 运行 `make` 命令进行编译。 6. 在编译你的程序时,使用以下命令进行链接: ``` gcc -o your_program your_program.c -L/path/to/x11/lib -L/path/to/xshm/lib -lX11 -lXext -lXrender -lXfixes -lXcomposite -lXau -lXdmcp -lXshmfence -lXtst -lXrandr -lXinerama ``` 其中 `-L/path/to/x11/lib` 和 `-L/path/to/xshm/lib` 分别指定了 X11 库和 XShm 库的目录,`-lX11`、`-lXext`、`-lXrender` 等参数表示链接相关的库。在其他操作系统或编译工具中,类似的链接命令可能会有所不同。 完成以上步骤后,你就可以在 ARM 设备上运行你的程序了。注意,你还需要在 ARM 设备上安装 X11 和相关的库才能使用 XShm。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值