tensorflow_cc导致对“omp_in_parallel@VERSION”的未定义引用

tensorflow_cc results in Undefined reference to `omp_in_parallel@VERSION'

提问人:Carlo Wood 提问时间:10/29/2023 更新时间:10/31/2023 访问量:101

问:

我安装在 Arch linux 上,但试图链接为tensorflow-opt-cuda

g++ -fopenmp "CMakeFiles/intro-hello-world.dir/hello-world.cc.o" -o intro-hello-world /usr/lib/libtensorflow_cc.so /usr/lib/libtensorflow_framework.so /usr/lib/libgomp.so -lpthread

结果如下:

/usr/bin/ld: /usr/lib/libtensorflow_cc.so: undefined reference to `omp_in_parallel@VERSION'
/usr/bin/ld: /usr/lib/libtensorflow_cc.so: undefined reference to `GOMP_barrier@VERSION'
/usr/bin/ld: /usr/lib/libtensorflow_cc.so: undefined reference to `omp_get_max_threads@VERSION'
/usr/bin/ld: /usr/lib/libtensorflow_framework.so: undefined reference to `kmp_set_blocktime@VERSION'
/usr/bin/ld: /usr/lib/libtensorflow_cc.so: undefined reference to `omp_get_num_threads@VERSION'
/usr/bin/ld: /usr/lib/libtensorflow_cc.so: undefined reference to `omp_get_thread_num@VERSION'
/usr/bin/ld: /usr/lib/libtensorflow_cc.so: undefined reference to `GOMP_parallel@VERSION'
/usr/bin/ld: /usr/lib/libtensorflow_framework.so: undefined reference to `omp_set_num_threads@VERSION'
collect2: error: ld returned 1 exit status

虽然我确实有(例如):

readelf --symbols --wide /usr/lib/libgomp.so | grep 'omp_get_num_threads'
    79: 0000000000017110    29 FUNC    GLOBAL DEFAULT   15 omp_get_num_threads@@OMP_1.0
   202: 00000000000241b0     9 FUNC    GLOBAL DEFAULT   15 omp_get_num_threads_@@OMP_1.0
   329: 0000000000017110    29 FUNC    LOCAL  DEFAULT   15 gomp_ialias_omp_get_num_threads
   734: 00000000000241b0     9 FUNC    GLOBAL DEFAULT   15 omp_get_num_threads_
   851: 0000000000017110    29 FUNC    GLOBAL DEFAULT   15 omp_get_num_threads

请注意,

readelf --symbols --wide /usr/lib/libtensorflow_cc.so | grep 'omp_get_num_threads'
  1122: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND omp_get_num_threads@VERSION (42)

这是怎么回事?这个链接应该吗?如果不是,那么谁应该受到责备?

C++ Linux TensorFlow OpenMP 链接器错误

评论

0赞 273K 10/29/2023
这种不寻常的联系而不是其他联系的原因是什么?使用 而不是 ,它为线程请求更多选项。/usr/lib/libgomp.so-lgomp-pthread-lpthread
0赞 ipapadop 10/29/2023
我认为这个tensorflow_cc是用英特尔 KML 编译的,可能期待英特尔的 OpenMP。
0赞 Carlo Wood 10/29/2023
@273K我正在使用 cmake 创建我的可执行文件,这就是它生成链接命令的方式(实际上,它使用 /usr/lib/libpthread.a 而不是 -lpthread ,但由于这不会影响错误,我手动将其替换为 -lpthread 以避免引起人们对使用静态 archine 的注意)。我也尝试使用 -lgomp 等,结果相同。
0赞 Carlo Wood 10/30/2023
@ipapadop 是的,事实证明是这样。但是,在安装 和 之后,仍然需要链接到(而不是预期的 libiomp5.so)。似乎缺少从 to 的符号链接。您是否知道该符号链接可能是由我仍然缺少的软件包提供的?intel-oneapi-openmpintel-oneapi-compiler-shared-runtime-libs/usr/lib/libtensorflow_cc.so.2libomp.solibomp.so/opt/intel/oneapi/compiler/latest/linux/compiler/lib/intel64_lin/libiomp5.so
0赞 Carlo Wood 10/30/2023
请注意,如果我直接链接,那么它就可以了,但它也链接了这显然不是我们想要的(删除它,它只是由于缺少 libomp.so 而无法链接)。-liomp5/usr/lib/libomp.so

答:

0赞 Carlo Wood 10/31/2023 #1

这个链接应该吗?

链接器错误有效。给出@VERSION时,符号必须附加一个字面上的“@VERSION”;它没有,因此找不到符号。

这是怎么回事?

您链接到错误的库。列出的符号由 定义,而不是 。安装软件包并获取它。libiomp5.solibomp.sointel-oneapi-openmpintel-oneapi-compiler-shared-runtime-libs

如果不是,那么谁应该受到责备?

拱门是罪魁祸首。首先,对 和 的依赖缺失。intel-oneapi-openmpintel-oneapi-compiler-shared-runtime-libs

请注意,后者仅对符号链接是必需的(而符号链接又由拥有 的符号链接指向)。所以这是另一个错误)。/opt/intel/oneapi/compiler/latest/usr/share/pkgconfig/openmp.pcintel-oneapi-openmp

更糟糕的是,他们确实如此

find "${pkgdir}"/usr/lib -type f -exec patchelf --replace-needed libiomp5.so libomp.so '{}' \; -print

在 TensorFlow 的末尾,请参阅存储库_package()PKGBUILDhttps://gitlab.archlinux.org/archlinux/packaging/packages/tensorflow.git

这会导致共享库想要链接到 ,这是错误的。libomp.so

评论

0赞 svenstaro 11/28/2023
我是 Arch Linux 中这个软件包的维护者之一。我用建议的更改推送了 2.15.0-2。希望一些测试人员对此表示赞赏。在我看来,patchelf hack 无论如何都有点可疑。
0赞 Carlo Wood 12/2/2023
@svenstaro谢谢。我试图重新打开导致添加此黑客的问题(以我的拙见,这不是黑客攻击,而是对报告该问题的人损坏的其他东西的错误“修复”)。反应是一封来自无回复电子邮件帐户的电子邮件,说我的重新打开尝试被拒绝了;我必须用最少的可重现测试用例和其他东西打开一个新问题。我显然没有:P。所以,我很高兴你从这里拿起了这个。尽管如此,我希望能就此进行更多的沟通:与此同时,我对 PKGBUILD 进行了许多其他更改