提问人:Carlo Wood 提问时间:10/29/2023 更新时间:10/31/2023 访问量:101
tensorflow_cc导致对“omp_in_parallel@VERSION”的未定义引用
tensorflow_cc results in Undefined reference to `omp_in_parallel@VERSION'
问:
我安装在 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)
这是怎么回事?这个链接应该吗?如果不是,那么谁应该受到责备?
答:
0赞
Carlo Wood
10/31/2023
#1
这个链接应该吗?
链接器错误有效。给出@VERSION时,符号必须附加一个字面上的“@VERSION”;它没有,因此找不到符号。
这是怎么回事?
您链接到错误的库。列出的符号由 定义,而不是 。安装软件包并获取它。libiomp5.so
libomp.so
intel-oneapi-openmp
intel-oneapi-compiler-shared-runtime-libs
如果不是,那么谁应该受到责备?
拱门是罪魁祸首。首先,对 和 的依赖缺失。intel-oneapi-openmp
intel-oneapi-compiler-shared-runtime-libs
请注意,后者仅对符号链接是必需的(而符号链接又由拥有 的符号链接指向)。所以这是另一个错误)。/opt/intel/oneapi/compiler/latest
/usr/share/pkgconfig/openmp.pc
intel-oneapi-openmp
更糟糕的是,他们确实如此
find "${pkgdir}"/usr/lib -type f -exec patchelf --replace-needed libiomp5.so libomp.so '{}' \; -print
在 TensorFlow 的末尾,请参阅存储库_package()
PKGBUILD
https://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 进行了许多其他更改
评论
/usr/lib/libgomp.so
-lgomp
-pthread
-lpthread
intel-oneapi-openmp
intel-oneapi-compiler-shared-runtime-libs
/usr/lib/libtensorflow_cc.so.2
libomp.so
libomp.so
/opt/intel/oneapi/compiler/latest/linux/compiler/lib/intel64_lin/libiomp5.so
-liomp5
/usr/lib/libomp.so