Arch Linux下tensorflow-opt-cuda链接时OpenMP符号未定义问题求助
问题描述
在Arch Linux上安装tensorflow-opt-cuda后,执行以下g++链接命令:
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
系统中libgomp.so确实存在对应符号:
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
但tensorflow_cc.so引用的符号带有@VERSION版本标记:
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)
问题分析与解决
核心原因
链接失败的本质是符号版本不匹配:
libtensorflow_cc.so和libtensorflow_framework.so编译时,依赖的OpenMP符号带有@VERSION版本标识;- 系统
libgomp.so提供的符号版本是@@OMP_1.0,与tensorflow期望的版本标记不兼容。
此外,tensorflow官方默认编译时通常使用**Intel OpenMP(libiomp5)**而非GNU的libgomp,这也是符号不匹配的重要原因——Arch的tensorflow-opt-cuda包可能沿用了这一编译配置,但系统默认链接的是GNU OpenMP库。
结论
这个链接操作无法成功,问题出在tensorflow-opt-cuda包的编译配置上:包编译时依赖的OpenMP实现(或符号版本)与系统当前提供的libgomp不兼容。
可行解决方案
- 改用Intel OpenMP库进行链接:编译时添加
-fopenmp=libiomp5参数,同时链接libiomp5.so(需先安装intel-oneapi-compiler-shared-runtime或相关包); - 手动重新编译tensorflow:配置编译选项使其适配系统的
libgomp; - 检索Arch Linux官方软件包的bug跟踪系统,确认是否为已知问题,查看官方提供的修复方案。
内容的提问来源于stack exchange,提问作者Carlo Wood
相关产品推荐
相关产品推荐

