pointnet++编译运行报错undefined symbol: _ZN10tensorflow12OpDefBuilder4AttrESs的问题解决

本文解决了在Ubuntu16.04环境下,使用TensorFlow1.13.1进行点云网络PointNet2训练时,遇到的tf_sampling_so.so符号未定义问题。通过调整编译脚本中的GCC选项,成功生成.so文件并运行train.py。

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

环境:ubuntu16.04 tensorflow=1.13.1 anaconda python=3.7
我在修改了tf_ops下的3d_interpolation、grouping、sampling 的三个文件夹下的各自.sh文件的路径后,成功编译生成了对应的.so文件。满心欢喜的运行train.py是时却又碰到了问题。在这里插入图片描述
tf_sampling_so.so报了一个问题:
undefined symbol: _ZN10tensorflow12OpDefBuilder4AttrESs

在作者的github上找到了有人与我有同样的问题。
如果你的gcc版本大于 4,则不需要选项-D_GLIBCXX_USE_CXX11_ABI = 0。

查看gcc的版本,我的为5.4.0
在这里插入图片描述
所以,我们在tf_sampling_compile.sh中去掉该选项,以我的为例,修改后:

#/bin/bash
/usr/local/cuda-10.0/bin/nvcc tf_sampling_g.cu -o tf_sampling_g.cu.o -c -O2 -DGOOGLE_CUDA=1 -x cu -Xcompiler -fPIC

#TF1.4
CUDA_ROOT=/usr/local/cuda-10.0
TF_ROOT=/home/jinye/anaconda3/envs/tensorflow-gpu/lib/python3.7/site-packages/tensorflow
g++ -std=c++11 tf_sampling.cpp tf_sampling_g.cu.o -o tf_sampling_so.so -shared -fPIC -I ${TF_ROOT}/include -I ${CUDA_ROOT}/include -I ${TF_ROOT}/include/external/nsync/public -lcudart -L ${CUDA_ROOT}/lib64/ -L ${TF_ROOT} -ltensorflow_framework -O2 #-D_GLIBCXX_USE_CXX11_ABI=0

重新运行后,该问题得到解决。
github对应大神的解决方案:https://github.com/charlesq34/pointnet2/issues/48

### Python 编译时出现 `undefined symbol` 错误的原因分析 在 TensorFlow 中,当尝试加载自定义操作(op)的 `.so` 文件并遇到 `_ZTIN10tensorflow8OpKernelE` 符号未定义错误时,通常表明编译过程中缺少必要的依赖项或链接选项。具体来说,该问题可能由以下几个原因引起: #### 原因一:未正确链接 Tensorflow 动态库 如果在使用 g++ 或其他 C++ 编译器构建自定义层时,未能正确链接到 `libtensorflow_framework.so` 库,则会出现此类错误。这是因为 `TensorFlow::OpKernel` 类型的相关符号并未被成功解析。 解决方案是在编译命令中显式指定 `-L` 和 `-l` 参数来引入所需的动态库路径及其名称[^3]。例如: ```bash g++ -std=c++11 -shared your_custom_op.cc \ -o max_align_bytes_op.so \ -fPIC $TF_CFLAGS $(echo $TF_LFLAGS | tr ' ' '\n' | grep -v tensorflow_compiler) \ -ltensorflow_framework -I/usr/include/tensorflow/ ``` 其中 `$TF_CFLAGS` 和 `$TF_LFLAGS` 是通过执行以下命令获取的环境变量设置: ```bash export TF_CFLAGS=$(python -c 'import tensorflow as tf; print(" ".join(tf.sysconfig.get_compile_flags()))') export TF_LFLAGS=$(python -c 'import tensorflow as tf; print(" ".join(tf.sysconfig.get_link_flags()))') ``` 上述脚本会自动检测当前安装版本对应的头文件位置以及静态/动态库所在目录,并将其传递给 GCC/G++ 工具链用于完成最终目标二进制模块生成过程中的必要配置工作。 #### 原因二:操作系统差异引发兼容性问题 对于基于 Windows Subsystem for Linux (WSL) 的开发场景而言,即使完成了正确的编译流程仍有可能遭遇类似的 runtime error 情况发生。这主要是由于 WSL 下模拟出来的 POSIX 层面行为与原生 GNU/Linux 存在细微差别所致[^4]。 因此建议尽可能切换至完全虚拟化或者裸机部署模式下重新测试整个项目生命周期内的各个阶段表现情况如何变化再做进一步判断处理决定是否需要调整相应策略措施加以应对解决办法如下所示: - **方法A**: 将源码迁移到 Ubuntu Server 版本服务器上运行; - **方法B**: 使用 Docker 容器技术封装一致性的运行时环境. ### 示例代码片段展示如何修正此问题 以下是经过改进后的完整 Makefile 范例供参考学习之用: ```makefile CC=g++ CXX_FLAGS=-std=c++11 -O2 -Wall -Wextra -pedantic-errors -pthread -fPIC LD_FLAGS=-shared SRC_FILES=custom_layer.cpp utils.cpp helper_functions.cpp TARGET_NAME=max_align_bytes_op.so all: compile clean compile: $(CC) $(CXX_FLAGS) $(SRC_FILES) -o $(TARGET_NAME) $(LD_FLAGS)\ $$($PYTHON_BIN -c "import tensorflow as tf;\ print(' '.join(['-D'+macro\ for macro in tf.__version__.split('-')[0].replace('.', '_')]))")\ -I$${PREFIX}/include -L$${PREFIX}/lib -ltensorflow_framework clean: rm -rf *.so *~ core.* a.out ``` 在此基础上还可以考虑增加交叉验证机制确保每次改动之后都能顺利通过单元测验从而减少潜在风险隐患提升整体质量水平达到预期效果标准之上。
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值