_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>好的,我现在要解决用户遇到的链接器警告问题,涉及C++、测试库以及只读段的重定位。用户提到的具体警告是`/usr/bin/ld 关于 _ZN7testing8internal18g_linked_ptr_mutexE 的重定位警告`。首先,我需要理解这个问题的背景和可能的原因。 首先,用户提到引用了[1]和[2]。根据引用[1],在新版C++中应避免使用`scoped_ptr`、`linked_ptr`或`auto_ptr`,而应使用`std::unique_ptr`。这可能意味着用户项目中使用了旧的智能指针,如`linked_ptr`,这可能与新版编译器或库不兼容,导致符号定义的问题。引用[2]提到了链接器查找库的路径,可能与库的链接顺序或路径有关。 接下来,用户的问题是关于`gtest`(Google Test框架)中的符号`_ZN7testing8internal18g_linked_ptr_mutexE`的重定位警告。重定位到只读段通常意味着某个变量被定义在了只读的段(如`.rodata`)中,但链接器在链接时试图修改它,或者存在多个定义导致冲突。 首先,我需要确认这个符号的来源。`g_linked_ptr_mutex`看起来像是Google Test内部使用的全局变量,可能与`linked_ptr`相关。根据引用[1],如果用户代码或测试库中使用了`linked_ptr`,这可能已经过时,而应该替换为`unique_ptr`。但如果是测试框架内部使用了这个符号,可能需要更新测试框架的版本,因为旧版本可能包含不兼容的代码。 其次,重定位到只读段的警告通常发生在链接时,当某个全局变量被多次定义,或者被不同编译单元以不同的方式声明(如一个地方声明为const,另一个地方没有)。这可能导致链接器在合并符号时出现问题,试图将可写和只读的段合并,从而产生警告。 可能的解决步骤包括: 1. **更新Google Test库**:检查使用的Google Test版本是否过时。旧版本可能包含使用`linked_ptr`的代码,而新版本可能已修复此问题。升级到最新版可能消除警告。 2. **检查代码中的智能指针使用**:确保用户代码中没有直接或间接使用`linked_ptr`或其他已弃用的智能指针。如果有,替换为`std::unique_ptr`或`std::shared_ptr`。 3. **检查符号的可见性**:确认`g_linked_ptr_mutex`是否在多个地方被定义。如果用户代码中无意中定义了同名的全局变量,可能导致冲突。使用`nm`或`objdump`工具检查目标文件中的符号定义。 4. **链接器选项调整**:尝试添加链接器选项如`-Wl,--allow-multiple-definition`,但这可能掩盖问题而非解决。更好的方法是确保符号只定义一次。 5. **检查编译选项**:确保所有涉及Google Test库的编译单元使用一致的编译器选项,特别是与可见性(如`-fvisibility`)和优化级别相关的选项。 6. **静态链接与动态链接**:如果使用的是动态链接库,尝试静态链接Google Test库,或反之,看是否问题消失,这可能帮助定位问题所在。 7. **查看官方文档或社区**:搜索Google Test的Issue跟踪系统,看看是否有已知问题或解决方案。其他用户可能遇到过类似问题并提供了解决方法。 8. **使用-fPIC编译**:如果库是动态链接的,确保所有目标文件使用位置无关代码(`-fPIC`选项)编译,以避免重定位问题。 在实施这些步骤时,需要逐步排查,例如先更新库版本,再检查代码中的智能指针使用,然后检查符号定义的一致性等。如果用户的环境允许,升级依赖库通常是解决兼容性问题的有效方法。如果问题依旧,可能需要更深入地分析符号冲突的具体原因,或者联系库的维护者寻求支持。</think>要解决链接器警告`/usr/bin/ld: 关于 _ZN7testing8internal18g_linked_ptr_mutexE 的重定位到只读段`,需从代码兼容性、库版本和编译配置入手。以下是具体步骤: --- ### 1. **更新Google Test框架** 此符号`g_linked_ptr_mutex`属于Google Test内部实现,旧版本可能使用了已弃用的`linked_ptr`。升级到新版本(如v1.12+)可修复兼容性问题: ```bash # 通过包管理器更新(例如Ubuntu) sudo apt-get install libgtest-dev # 或手动编译最新源码 git clone https://github.com/google/googletest.git cd googletest && mkdir build && cd build cmake .. && make && sudo make install ``` --- ### 2. **替换代码中的废弃智能指针** 若项目中直接使用了`linked_ptr`(如旧版Google Test的依赖),按引用[1]建议替换为`std::unique_ptr`: ```cpp // 废弃写法 testing::internal::linked_ptr<Foo> ptr; // 替换为 std::unique_ptr<Foo> ptr; ``` --- ### 3. **检查符号冲突** 使用`nm`命令检查目标文件中`g_linked_ptr_mutex`的定义是否重复或冲突: ```bash nm your_object_file.o | grep g_linked_ptr_mutex ``` - 若存在多个定义,需确保仅有一个编译单元包含该符号的定义。 --- ### 4. **调整链接器参数** 添加链接选项`-Wl,--as-needed`或指定库路径(参考引用[2]): ```bash # 显式链接pthread库(解决互斥锁依赖) g++ your_code.cpp -lgtest -lgtest_main -lpthread -Wl,--as-needed # 或指定库搜索路径 g++ your_code.cpp -L/usr/local/lib -Wl,-rpath=/usr/local/lib -lgtest ``` --- ### 5. **静态链接Google Test** 避免动态库版本不匹配问题: ```bash # 编译时静态链接 g++ your_code.cpp /usr/local/lib/libgtest.a -lpthread ``` --- ### 6. **验证编译选项一致性** 确保所有文件编译时启用位置无关代码(`-fPIC`): ```bash g++ -c your_code.cpp -fPIC g++ your_code.o -lgtest -shared -o libtest.so ``` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值