我在 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)
发生什么事了?这个链接应该还是不应该链接?如果不是那么该怪谁呢?
链接过程中列出库的顺序有时很重要。尝试重新排序您正在链接的库。将依赖于 OpenMP 的库(例如 TensorFlow)放置在链接器命令中的 OpenMP 本身之后。
g++ -fopenmp "CMakeFiles/intro-hello-world.dir/hello-world.cc.o" -o intro-hello-world /usr/lib/libgomp.so -lpthread /usr/lib/libtensorflow_cc.so /usr/lib/libtensorflow_framework.so
确保 TensorFlow 本身是使用您尝试链接的相同版本的 OpenMP 构建的。如果 OpenMP 版本不匹配,可能会导致链接问题。
如果上述解决方案均不起作用,您可能需要考虑检查您在 Arch Linux 上安装的特定 TensorFlow 软件包。该包的依赖项或编译方式可能存在一些问题。