编译TensorFlow C++程序时出现undefined reference错误求助
问题
按照以下步骤构建TensorFlow C++ API库:
git clone https://github.com/tensorflow/tensorflow cd tensorflow git checkout v2.11.0 bazel build //tensorflow:libtensorflow_cc.so bazel build //tensorflow:libtensorflow_framework.so bazel build //tensorflow:install_headers
编写测试程序my_program.cpp:
#include <tensorflow/core/platform/env.h> #include <tensorflow/core/public/session.h> #include <iostream> using namespace std; using namespace tensorflow; int main() { Session* session; Status status = NewSession(SessionOptions(), &session); if (!status.ok()) { cout << status.ToString() << "\n"; return 1; } cout << "Session successfully created.\n"; }
使用以下命令编译时出现链接错误,提示tensorflow::SessionOptions::SessionOptions()等符号未定义,但通过nm检查libtensorflow_cc.so确认对应符号存在:
g++ \ -std=c++17 \ -I./tensorflow/bazel-bin/tensorflow/include/ \ -I./root/.cache/bazel/_bazel_root/68a62076e91007a7908bc42a32e4cff9/external/com_google_protobuf/src/ \ -L./tensorflow/bazel-bin/tensorflow/ \ -ltensorflow_cc \ -ltensorflow_framework \ my_program.cpp -o my_program
原因与解决办法
核心原因:编译参数顺序错误
GCC链接器遵循从左到右解析输入的逻辑:
- 先处理源文件/目标文件,记录其中的未定义符号
- 再处理库文件,用库内符号匹配当前已记录的未定义符号
你的命令把源文件my_program.cpp放在了库参数之后,导致链接器先处理TensorFlow库时,还未读取到源文件的符号需求,因此不会将库中相关符号纳入链接。后续处理源文件时,未定义符号无法被解析,最终报错。
额外注意事项
- 头文件路径:当前使用的
./tensorflow/bazel-bin/tensorflow/include/是正确的,install_headers目标会将头文件安装到该目录 - C标准匹配:TensorFlow 2.11默认用C17编译,
-std=c++17参数无需调整 - 库依赖顺序:
libtensorflow_cc.so依赖libtensorflow_framework.so,当前命令中-ltensorflow_cc在前、-ltensorflow_framework在后的顺序是正确的
修正后的编译命令
将源文件移至最前端,库参数放在后面:
g++ \ my_program.cpp \ -std=c++17 \ -I./tensorflow/bazel-bin/tensorflow/include/ \ -I./root/.cache/bazel/_bazel_root/68a62076e91007a7908bc42a32e4cff9/external/com_google_protobuf/src/ \ -L./tensorflow/bazel-bin/tensorflow/ \ -ltensorflow_cc \ -ltensorflow_framework \ -o my_program
执行修正后的命令即可正常生成可执行文件,运行后会输出Session successfully created.。
内容的提问来源于stack exchange,提问作者Sarrión
相关产品推荐
相关产品推荐

