_ZN10tensorflow8internal21CheckOpMessageBuilder9NewStringEv

当在PU-GAN代码中遇到编译错误`tensorflow.python.framework.errors_impl.NotFoundError`,通常是由于CUDA版本不匹配或TensorFlow库路径错误造成的。解决方法包括检查并修改CUDA版本号,确保与系统安装的版本一致,以及更新Python和TensorFlow库的路径。此外,`_ZN10tensorflow8internal21CheckOpMessageBuilder9NewStringEv`错误可能与`_GLIBCXX_USE_CXX11_ABI`标志有关,需要根据TensorFlow版本调整该标志的值。完成修改后,重新编译tf_ops相关的.sh文件。

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

undefined symbol: _ZN10tensorflow8internal21CheckOpMessageBuilder9NewStringEv

这是一类错误。问题的指向编译没有编译成功。前面的错误 tensorflow.python.framework.errors_impl.NotFoundError: /home/wjay/deeplearning/PU-GAN/PU-G
AN-master/tf_ops/sampling/tf_sampling_so.so: 这是告诉你哪个文件没有编译好。针对这个文件到对应的sh文件中修改。

我的应用场景是PU-GAN的代码没有编译成功。没有前面的错误好修改,通过提示,你可以猜到,其实是因为我们从github下载的代码,别人的环境以及路径个跟我们的不一致的导致的。

举个简单的例子:

在PU-GAN代码中需要编译tf_ops下所有的tf_xxx_compile.sh文件:

#!/usr/bin/env bash
#/bin/bash
/usr/local/cuda-10.1/bin/nvcc tf_sampling_g.cu -o tf_sampling_g.cu.o -c -O2 -DGOOGLE_CUDA=
1 -x cu -Xcompiler -fPIC#g++ -std=c++11 tf_sampling.cpp tf_sampling_g.cu.o -o tf_sampling_so.so -shared -fPIC -I /
data/lirh/anaconda3/envs/tensorflow3/lib/python3.6/site-packages/tensorflow/include  -I /usr/local/cuda-8.0/include -lcudart -L /usr/local/cuda-8.0/lib64/ -O2 -D_GLIBCXX_USE_CXX11_ABI=0g++ -std=c++11 tf_sampling.cpp tf_sampling_g.cu.o -o tf_sampling_so.so -shared -fPIC -I /h
ome/lirh/anaconda3/envs/tensorflow11/lib/python3.6/site-packages/tensorflow/include  -I /usr/local/cuda-8.0/include -I /home/lirh/anaconda11/envs/tensorflow3/lib/python3.6/site-packages/tensorflow/include/external/nsync/public -lcudart -L /usr/local/cuda-8.0/lib64/ -L/home/lirh/anaconda3/envs/tensorflow11/lib/python3.6/site-packages/tensorflow -ltensorflow_framework -O2 -D_GLIBCXX_USE_CXX11_ABI=1

源文件如此,通过观察我们知道:原作者,用的cuda是10.1,但我是9.0,那么我们就需要把所有cuda-10.1修改为9.0。修改完之后,我们还会报错:因为tensorflow的位置不对,再观察发现作者用的anaconda3所以,你要换成自己的python路径。把所有python3.6的地方换成自己的python3.6路径。

操作完上面两个地方后,还是有个问题:编译没有通过,错误如文章一开头。

解决方案:

1. Problem

When buiding cumtom op in tensorflow, this error occured.

tensorflow.python.framework.errors_impl.NotFoundError: /home/zyt3781909/project/project/objdect/networks/layers/roi_pooling_layer/roi_pooling.so: undefined symbol: _ZN10tensorflow8internal21CheckOpMessageBuilder9NewStringEv

2. Solution

link

-D_GLIBCXX_USE_CXX11_ABI=0

0 -> 1 or 1 -> 0.

此外还有如下错误:

错误信息为:tensorflow.python.framework.errors_impl.NotFoundError: /home/wjay/deeplearning/PU-GAN/PU-GAN-master/tf_ops/grouping/tf_grouping_so.so: undefined symb
ol: _ZN10tensorflow8internal21CheckOpMessageBuilder9NewStringB5cxx11Ev

#!/usr/bin/env bash
#/bin/bash
/usr/local/cuda-9.0/bin/nvcc tf_sampling_g.cu -o tf_sampling_g.cu.o -c -O2 -DGOOGLE_CUDA=1 -x cu -Xcompiler -fPIC
#g++ -std=c++11 tf_sampling.cpp tf_sampling_g.cu.o -o tf_sampling_so.so -shared -fPIC -I /data/lirh/anaconda3/envs/tensorflow3/lib/python3.6/site-packages/tensorflow/include  -I /usr/local/cuda-8.0/include -lcudart -L /usr/local/cuda-8.0/lib64/ -O2 -D_GLIBCXX_USE_CXX11_ABI=0
g++ -std=c++11 tf_sampling.cpp tf_sampling_g.cu.o -o tf_sampling_so.so -shared -fPIC -I /home/wjay/.local/lib/python3.6/site-packages/tensorflow/include  -I /usr/local/cuda-9.0/include -I /home/wjay/.local/lib/python3.6/site-packages/tensorflow/include/external/nsync/public -lcudart -L /usr/local/cuda-9.0/lib64/ -L/home/wjay/.local/lib/python3.6/site-packages/tensorflow -ltensorflow_framework   -O2  -D_GLIBCXX_USE_CXX11_ABI=0

修改方式还是修改最后的0或者1。修改完,别忘sh tf_xxx.sh编译一下。

 

<think>好的,我现在需要解决用户遇到的Qt编译错误:undefined reference to `_imp__ZN10QTcpSocketC1EP7QObject`。用户提到已经在.pro文件中添加了serialport,并且在main.cpp中包含了正确的头文件,但依然出现链接错误。我需要根据提供的引用和我的知识来分析可能的原因和解决方案。 首先,这个错误通常发生在链接阶段,意味着编译器找到了头文件声明,但链接器找不到对应的实现库。类似的问题在引用[1]、[2]、[3]中都提到过,都是关于Qt库的链接错误。例如,引用[1]和[2]讨论了QSerialPort的类似错误,指出可能缺少QT += serialport或者在.pro文件中未正确配置模块。引用[3]则涉及QtCharts的链接问题,解决方法包括添加正确的模块和检查库路径。 接下来,针对QTcpSocket的情况,我应该考虑以下几点: 1. **模块配置**:检查.pro文件是否包含network模块,因为QTcpSocket属于Qt Network模块。用户可能只添加了serialport而遗漏了network。正确的做法是在.pro文件中添加`QT += network`。 2. **Qt版本兼容性**:用户提到之前在不同Qt版本间切换出现问题(如引用[2]中的Qt5.7和Qt4.8.6的冲突)。需要确认当前使用的Qt版本是否与项目配置兼容,尤其是是否混用了不同版本的库文件。 3. **清理和重新构建**:有时候旧的编译文件可能导致问题,建议清理项目并重新构建。删除构建目录,重新运行qmake和编译。 4. **库文件路径**:确保Qt安装正确,且编译器能够找到对应的库文件。可能需要检查Qt的安装路径是否被正确设置,特别是在切换版本后。 5. **头文件包含方式**:虽然用户已经包含了头文件,但需要确认是否使用了正确的包含路径,例如`#include <QTcpSocket>`而非其他路径。 6. **动态链接库问题**:在Windows下,链接错误可能涉及动态库(.dll)的缺失。需要确认编译时链接了正确的库文件,例如Qt5Network.dll是否存在,并且部署时这些DLL在正确的位置。 综合这些可能性,我应该分步骤指导用户检查.pro文件配置,确认模块添加,清理项目,检查Qt版本和库路径。同时,提醒用户注意版本兼容性和动态库的问题,确保所有配置正确无误。</think>### 解决`undefined reference to _imp__ZN10QTcpSocketC1EP7QObject`错误的分步指南 此错误属于Qt编译时的**链接阶段错误**,表示编译器能找到头文件声明但找不到对应的实现库。以下是具体解决方案: --- #### 1. 检查.pro文件模块配置 在Qt项目的`.pro`文件中**必须显式添加Network模块**: ```qmake QT += core gui network # 确保包含network模块 ``` * 如果使用Qt6,可能需要改为`QT += core5compat network`(部分模块拆分)[^1] * 保存后执行**qmake重新生成Makefile** --- #### 2. 验证Qt安装完整性 通过Qt Maintenance Tool检查是否安装了对应模块: - **Windows**:打开`Qt安装目录\版本号\msvc2019_64\lib`,检查是否存在`Qt5Network.lib`(Qt5)或`Qt6Network.lib`(Qt6) - **Linux**:检查`/usr/lib/x86_64-linux-gnu/qt5/libQt5Network.so`等库文件 --- #### 3. 清理并重新构建项目 执行以下操作清除旧编译文件: 1. 删除`build`目录(或手动清理所有生成的.o/.obj文件) 2. Qt Creator菜单栏选择`构建 -> 清理所有项目` 3. 重新运行`qmake`(右键项目选择“执行qmake”) 4. 重新编译 --- #### 4. 检查头文件包含方式 确认代码中的包含语句为**标准Qt头文件格式**: ```cpp #include <QTcpSocket> // 正确方式(Qt自动处理路径) // 避免使用绝对路径如 #include "QtNetwork/QTcpSocket" ``` --- #### 5. 验证Qt版本环境(关键步骤) 通过`qmake -v`查看当前使用的Qt版本: ```bash qmake -v # 输出应包含类似 "Using Qt version 5.15.2 in ..." ``` * 如果存在多版本Qt混用,在Qt Creator中通过`项目 -> Build设置 -> Qt版本`指定正确版本 * 环境变量检查(Windows): ```cmd echo %PATH% # 确认Qt的bin目录路径在最前,例如 C:\Qt\5.15.2\msvc2019_64\bin ``` --- #### 6. 补充解决方案 | 现象 | 解决方案 | |-------|---------| | 使用MSVC编译器报错 | 安装对应的**Qt VS Tools**并检查VC++目录设置 | | MinGW编译器报错 | 确认安装时勾选了`MinGW 32/64-bit`组件 | | 动态库缺失(运行时) | 将`Qt5Network.dll`复制到可执行文件目录 | --- ### 典型错误场景示例 ```qmake # 错误配置示例 QT += core gui # 缺少network模块 # 正确配置 QT += core gui network ``` ```cpp // 错误头文件包含示例 #include "network/QTcpSocket" // 非标准路径 #include <QtNetwork/QTcpSocket/QTcpSocket> // 冗余路径 // 正确方式 #include <QTcpSocket> ``` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值