lua-5.2.3编译问题记录"libreadline.so: undefined reference to `PC'"

本文介绍了解决 Lua 编译时遇到的因 readline 库依赖未指定而导致的错误,并提供了详细的解决方案及正确安装 Lua 5.2.3 的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  作者:zhanhailiang 日期:2014-10-21
[root@~/software]# cd lua-5.2.3
[root@~/software/lua-5.2.3]# make linux
cd src && make linux
make[1]: Entering directory `/root/software/lua-5.2.3/src'
make all SYSCFLAGS="-DLUA_USE_LINUX" SYSLIBS="-Wl,-E -ldl -lreadline"
make[2]: Entering directory `/root/software/lua-5.2.3/src'
gcc -o lua   lua.o liblua.a -lm -Wl,-E -ldl -lreadline 
/usr/local/lib/libreadline.so: undefined reference to `PC'
/usr/local/lib/libreadline.so: undefined reference to `tgetflag'
/usr/local/lib/libreadline.so: undefined reference to `tgetent'
/usr/local/lib/libreadline.so: undefined reference to `UP'
/usr/local/lib/libreadline.so: undefined reference to `tputs'
/usr/local/lib/libreadline.so: undefined reference to `tgoto'
/usr/local/lib/libreadline.so: undefined reference to `tgetnum'
/usr/local/lib/libreadline.so: undefined reference to `BC'
/usr/local/lib/libreadline.so: undefined reference to `tgetstr'
collect2: ld returned 1 exit status
make[2]: *** [lua] Error 1
make[2]: Leaving directory `/root/software/lua-5.2.3/src'
make[1]: *** [linux] Error 2
make[1]: Leaving directory `/root/software/lua-5.2.3/src'
make: *** [linux] Error 2

这是由于lua编译依赖readline库,readline库依赖ncurses库。但没有指定。就会出现“没有定义的符合引用”错误。

解决方式是改动${LUA_DIR}/src/Makefile中linux编译target=linux。在SYSLIBS变量中追加‘-lncurses’选项就可以。例如以下:

105 linux:
106         $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_LINUX" SYSLIBS="-Wl,-E -ldl -lreadline -lncurses"

此时又一次运行:

[root@~/software/lua-5.2.3]# make linux install
cd src && make linux
make[1]: Entering directory `/root/software/lua-5.2.3/src'
make all SYSCFLAGS="-DLUA_USE_LINUX" SYSLIBS="-Wl,-E -ldl -lreadline -lncurses"
make[2]: Entering directory `/root/software/lua-5.2.3/src'
make[2]: Nothing to be done for `all'.
make[2]: Leaving directory `/root/software/lua-5.2.3/src'
make[1]: Leaving directory `/root/software/lua-5.2.3/src'
cd src && mkdir -p /usr/local/bin /usr/local/include /usr/local/lib /usr/local/man/man1 /usr/local/share/lua/5.2 /usr/local/lib/lua/5.2
cd src && install -p -m 0755 lua luac /usr/local/bin
cd src && install -p -m 0644 lua.h luaconf.h lualib.h lauxlib.h lua.hpp /usr/local/include
cd src && install -p -m 0644 liblua.a /usr/local/lib
cd doc && install -p -m 0644 lua.1 luac.1 /usr/local/man/man1

至此,lua-5.2.3成功安装:

[root@~/software/lua-5.2.3/src]# /usr/local/bin/lua -v
Lua 5.2.3  Copyright (C) 1994-2013 Lua.org, PUC-Rio
<think>我们正在解决BlueZ编译过程中出现的与libreadline相关的链接错误。错误信息类似于“undefinedreferenceto`PC&#39;”,这通常是由于链接器无法找到readline库中某些符号(特别是PC)的定义。根据引用[2]中提到的lua编译问题,类似的错误可能是由于readline库与ncurses库的链接顺序问题或版本不兼容导致的。###问题分析在编译BlueZ(bluez-5.50)时,如果出现以下错误:```libreadline.so:undefinedreferenceto`PC&#39;```这通常意味着:1.**链接顺序不正确**:在链接时,readline库需要在ncurses库之前指定,因为readline依赖于ncurses。2.**readline库版本不兼容**:系统中安装的readline库可能是新版本(如8.x),而编译脚本期望的是旧版本(如6.x)的符号。3.**缺少必要的依赖库**:系统可能缺少ncurses或tinfo库(ncurses的一部分)。引用[1]中提到了多个库找不到的问题libreadline.so.6,libncurses.so.5等),这表明系统可能缺少这些库或者版本不对应。引用[2]中的解决方法是显式地在链接时加上`-lreadline-lncurses`,并注意顺序。###解决方案步骤####1.安装必要的依赖库确保系统安装了readline和ncurses的开发包。以Ubuntu为例:```bashsudoapt-getinstalllibreadline-devlibncurses5-dev```对于其他发行版,请使用相应的包管理命令(如yum,dnf等)。####2.检查库文件是否存在确认库文件在系统中存在:```bash#检查readlinels/usr/lib/x86_64-linux-gnu/libreadline.so#检查ncursesls/usr/lib/x86_64-linux-gnu/libncurses.so```如果不存在,可能需要安装对应版本的库。####3.修改BlueZ的配置脚本在编译BlueZ时,可能需要调整链接库的顺序。编辑`configure`脚本或`Makefile`,确保链接顺序为`-lreadline-lncurses`(先readline后ncurses)。如果BlueZ使用autotools构建,可以在配置时通过环境变量指定链接库:```bash./configureLIBS=&quot;-lreadline-lncurses&quot;```或者,如果已经运行过configure,可以修改生成的`Makefile`,找到`BLUEZ_LIBS`变量,并调整库的顺序。####4.显式添加链接库如果步骤3不成功,可以尝试在Makefile中显式添加`-ltinfo`(tinfo是ncurses的一部分):```bash./configureLIBS=&quot;-lreadline-lncurses-ltinfo&quot;```####5.使用旧版readline(如果必要)如果系统中readline版本过高(如8.x),而BlueZ需要旧版符号(如readline6.x),可以尝试安装旧版readline开发包,并在配置时指定:```bashsudoapt-getinstalllibreadline6-dev./configureLIBS=&quot;-lreadline6-lncurses&quot;```####6.重新编译并安装```bashmakecleanmakesudomakeinstall```###关键点说明-**链接顺序**:由于readline依赖于ncurses,因此readline必须放在ncurses之前。链接器按顺序解析符号,如果先链接ncurses,则readline中的符号(如PC)可能无法解析。-**库版本**:如果错误信息中提到了特定版本(如libreadline.so.6),则需要安装对应版本的开发包。###验证编译完成后,使用`ldd`检查生成的BlueZ可执行文件是否链接了正确的库:```bashldd/path/to/bluetoothd|grepreadline```应该能看到类似`libreadline.so.6=>/lib/x86_64-linux-gnu/libreadline.so.6`的输出。---§§相关问题§§1.如何检查Linux系统中已安装的readline版本?2.编译软件时如何正确指定链接库的顺序?3.如何解决其他常见的“undefinedreference”链接错误?4.BlueZ编译过程中可能遇到的其他常见错误有哪些?5.如何为不同的Linux发行版安装readline和ncurses开发包?</think>## 解决 BlueZ 5.50 编译&quot;libreadline.so undefined reference to PC&quot; 错误 ### 问题分析 错误 `undefined reference to PC` 表明 BlueZ 在链接阶段无法找到 readline 库中的 `PC` 符号。这是典型的库链接顺序问题或库版本不兼容问题,常见原因包括: 1. **链接顺序错误**:readline 库需要在 ncurses/tinfo 库 **之后** 链接 2. **库版本不匹配**:系统安装的 readline/ncurses 版本与编译需求不兼容 3. **符号缺失**:新版本 readline 移除了 `PC` 等传统符号(参考引用[2]) --- ### 解决方案步骤 #### 1. 安装必需依赖库 ```bash # Ubuntu/Debian sudo apt install libreadline-dev libncurses5-dev libtinfo5 libssl-dev # CentOS/RHEL sudo yum install readline-devel ncurses-devel openssl-devel ``` #### 2. 修改 BlueZ 编译配置 编辑 BlueZ 源码目录中的 `Makefile` 或 `configure` 文件: ```makefile # 在 LIBS 变量中添加 -lreadline -ltinfo -lncurses LIBS += -lreadline -ltinfo -lncurses # 确保链接顺序正确(readline 必须在 ncurses 之后) LIBS = ... -lncurses -lreadline ... ``` #### 3. 编译时显式指定链接库 如果通过 `configure` 编译,添加链接参数: ```bash ./configure LIBS=&quot;-lreadline -ltinfo -lncurses&quot; \ LDFLAGS=&quot;-L/usr/lib/x86_64-linux-gnu&quot; ``` #### 4. 解决符号缺失问题(关键步骤) 对于较新的 readline 版本(>7.0),需要添加兼容性定义: ```c // 在 BlueZ 源码中创建 compat_readline.c 文件 #include <readline/readline.h> // 提供缺失的 PC 符号 char *PC = NULL; // 编译时包含此文件 gcc ... -c compat_readline.c ``` #### 5. 验证修复 ```bash make clean make # 检查是否仍有 undefined reference 错误 ``` --- ### 链接顺序原理 正确的库链接顺序至关重要: ``` 应用程序 → readline → ncurses/tinfo → 系统库 ``` 错误顺序会导致: ``` 应用程序 → readline → 缺失符号(PC等) ``` ### 版本兼容方案 | 系统环境 | 解决方案 | |-----------------------|-----------------------------| | Readline < 7.0 | 正常链接无需补丁 | | Readline ≥ 7.0 | 添加 `PC` 兼容定义 | | 缺少 libtinfo | 安装 ncurses-libs 或兼容包 | > ⚠️ **注意**:Ubuntu 20.04+ 和 CentOS 8+ 默认使用 readline 8.x,必须添加兼容性符号定义(参考引用[2]中Lua的类似问题---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值