使用SCons构建TensorFlow C++项目时遇未定义符号错误
解决TensorFlow CC库链接时的Undefined Symbols问题
这个问题我之前帮同行排查过好几次,核心原因就是你的测试代码编译时的C++ ABI标准和TensorFlow构建时的ABI不匹配,具体就是错误里提到的[abi:cxx11]符号不兼容。下面给你几个针对性的解决办法:
1. 统一C++标准和ABI编译参数
TensorFlow(尤其是新版本)默认是用C++11及以上标准,并且启用cxx11 ABI构建的。你需要在SCons脚本里强制测试代码使用相同的参数:
- 在构建环境里添加
CXXFLAGS参数:
这里的env = Environment( CXXFLAGS=['-std=c++11', '-D_GLIBCXX_USE_CXX11_ABI=1', '-I/usr/local/include'] )-D_GLIBCXX_USE_CXX11_ABI=1是关键,它控制GCC对std::string等容器的实现版本,必须和TensorFlow编译时的设置完全一致,否则就会出现符号不匹配。
2. 链接所有必要的TensorFlow依赖库
你现在只链接了libtensorflow_cc.so,但TensorFlow的CC库还依赖libtensorflow_framework.so,这个库包含了框架层的核心符号,比如你报错里的CheckOp相关函数。所以要把它加入链接列表:
env.Append( LIBS=['tensorflow_cc', 'tensorflow_framework'], LIBPATH=['/usr/local/lib', 'lib'] )
确保libtensorflow_framework.so在你指定的LIBPATH路径下,比如默认安装的话应该在/usr/local/lib里。
3. 验证TensorFlow库的符号兼容性
如果上面两步还没解决,你可以手动检查TensorFlow库是否包含目标符号:
nm -D /usr/local/lib/libtensorflow_cc.so | grep TfCheckOpHelperOutOfLine
如果输出里有带[abi:cxx11]的符号,说明库本身是支持的,问题还是出在测试代码的编译参数;如果没有找到这个符号,那你可能需要重新用Bazel编译TensorFlow,编译时明确指定ABI参数:
bazel build --cxxopt=-std=c++11 --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=1 //tensorflow:libtensorflow_cc.so //tensorflow:libtensorflow_framework.so
完整SCons脚本示例
把上面的配置整合起来,你的SCons脚本大概是这样:
env = Environment( CXX='g++', CXXFLAGS=['-std=c++11', '-D_GLIBCXX_USE_CXX11_ABI=1', '-I/usr/local/include'], LIBS=['tensorflow_cc', 'tensorflow_framework'], LIBPATH=['/usr/local/lib', 'lib'] ) # 编译并链接生成目标文件 env.Program('bin/tftest', ['test/test.o'])
内容的提问来源于stack exchange,提问作者Cow
相关产品推荐
相关产品推荐

