linux下编译C++文件(undefined reference to.....解决办法)

本文介绍了一种在C++程序中实现串口操作的方法,并通过一个测试函数进行了验证。在编译过程中遇到了未定义引用错误,最终通过确保所有相关文件都被编译解决了问题。

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

在编写窗口通讯的程序中,设计了一个类serial.cpp,是专门操作串口的。
为了测试它,又写了一个测试函数test_main.cpp 。
编译时: 
g++ -o main test_main.cpp 
结果老是出错:
/tmp/ccWdHekq.o: In function `main':
test_serial.cpp:(.text+0x6a): undefined reference to `serial::open_port(char*)'
test_serial.cpp:(.text+0x88): undefined reference to `serial::write_port(char*)'
test_serial.cpp:(.text+0x9f): undefined reference to `serial::read_port()'
test_serial.cpp:(.text+0xb6): undefined reference to `serial::close_port()'
collect2: ld 返回 1


其实错误很明显了,说明serial.cpp没有编译,导致连接失败,所以提示“undefined reference to...”。
使用Eclipse的时候,建立一个Managed Make C++ Project,已经将所有的C++文件编译过了,才不会报错的。
在网上找了半天,终于找到了一点点帮助,其实编译的过程中需要将连接用到的文件全部编译的。

使用如下的编译命令:

g++ -g -o Main Main.cpp test_main.cpp

就可以成功编译。然后运行:

./Main
### 解决 `undefined reference to` 错误与 GLIBC_2.34 链接问题 当遇到 `undefined reference to` 类型的错误时,这通常意味着链接器找不到某些符号的定义。对于涉及 `GLIBC_2.34` 的情况,这类问题往往源于使用的 GCC 或 G++ 编译器版本不匹配或者运行库版本不同步。 #### 使用特定版本的 GLIBC 为了确保兼容性并解决此类链接错误,在构建项目之前应确认系统的 GLIBC 版本是否满足需求。可以通过指定较低版本的 GLIBC 来规避此问题: ```bash export LD_LIBRARY_PATH=/path/to/older/glibc:$LD_LIBRARY_PATH ``` 此外,还可以通过设置环境变量来强制使用旧版动态链接器: ```bash export LD=$PWD/path_to_old_glibc_ld ``` #### 修改编译选项 另一种解决方案是在编译命令中添加 `-static-libstdc++` 参数以静态链接标准 C++ 库[^5]。这样做可以避免由于共享库版本差异引起的问题。例如: ```cpp g++ -o myprogram main.cpp -static-libstdc++ ``` #### 更新或降级软件包 有时解决问题最直接的方式可能是升级整个发行版或是回滚到更稳定的系统状态。特别是针对较新的 GLIBC 要求,考虑安装一个支持这些新特性的操作系统镜像可能会更加省事[^4]。 #### 指定链接器路径 如果上述方法仍未能解决问题,则可以在项目的 CMake 文件里增加自定义链接器路径,从而指向正确的工具链位置[^3]: ```cmake set(CMAKE_EXE_LINKER_FLAGS "-L/usr/local/lib64") ``` 以上措施能够有效处理大多数由 GLIBC 版本引起的未解析外部引用问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值