在前一篇文章《Windows 下编译 Tensorflow C++ API v1.8 Release 版动态库》介绍了 Release 版的编译,但按这个去编译 Debug 版是不行的,有坑啊!

在编译到最后,生成 tensorflow.dll 的时候会报 LNK1189:library limit of 65535 objects exceeded 错误。

这个问题是因为 tensorflow.dll 导出的函数太多,超过了 65535 这个限制;置于为什么有这个限制,可以参考1

知道问题所在,就相对好办了;再看看 TensorFlow C++ Reference,根本不该导出超过 65535 个函数啊!那一定导出了不该导出的函数,想办法不让他们被导出应该就可以了。

再看 tensorflow\contrib\cmake\tools\create_def_file.py 文件,里面就做了哪些该被导出,哪些不该被导出的事。

修改 tensorflow\contrib\cmake\tools\create_def_file.py 中的 EXCLUDE_RE 变量。修改为:

EXCLUDE_RE = re.compile(r"RTTI|deleting destructor|::internal::|::`anonymous namespace'::|<lambda_[0-9a-z]+>|"
                        r"std::_Vector_iterator<|std::_Vector_const_iterator<|std::_Vector_alloc<|"
                        r"std::_Deque_iterator<|std::_Deque_alloc<|"
                        r"std::_Tree_iterator<|std::_Tree_const_iterator<|std::_Tree_unchecked_const_iterator<|std::_Tree_comp_alloc<|std::_Tree_node<|"
                        r"std::_List_iterator<|std::_List_const_iterator<|std::_List_unchecked_const_iterator<|std::_List_alloc<|"
                        r"std::_Iterator012<|std::_Compressed_pair<"
)

修改后,再类似 Release 的方式编译 Debug 版就可以了。