我们正在自己构建 Tcl,以便将我们自己编译的二进制文件与应用程序一起分发。应用程序本身链接到 Tcl 库并在内部使用 API。
为了构建 Tcl,我们从 http://sourceforge.net/projects/tcl/ 获得了源代码,然后我们导航到/win 目录,更改 buildall.vc.bat 文件以指向我们的 MSVC 安装,然后我们运行该 bat 文件。构建工作按预期进行,输出在/win/Release_VC11 中生成。更具体地说,生成了 tcl85.lib 和 tcl85.dll。
当我们从我们的 Qt C++ 应用程序中链接到这个 .lib 时,我们会遇到一堆链接器错误。例如:
commands.obj : error LNK2019: unresolved external symbol __imp_Tcl_AppendResult
referenced in function "int __cdecl CallQMessageBox(void *,struct Tcl_Interp *,
int,char * * const)" (?CallQMessageBox@@YAHPEAXPEAUTcl_Interp@@HQEAPEAD@Z)
但是,当我们链接到作为 ActiveState Tcl 分发的一部分提供的 tcl85.lib 文件时,链接器没有任何问题并且可以正常构建。我们验证了这两种情况下的 Tcl 版本完全相同。
我们使用MSVC 2012 (Express Edition)构建Tcl,buildall.vc.bat中的构建命令保持不变:
::set OPTS=threads
if not %SYMBOLS%.==. set OPTS=symbols
nmake -nologo -f makefile.vc release OPTS=%OPTS% %1
我们一直在尝试各种各样的事情,但运气不佳。
最佳答案
好的,明白了:
我将 Tcl 构建为 32 位二进制文件而不是 64 位二进制文件。
替换
call "D:\tools\Microsoft Visual Studio 11.0\VC\bin\vcvars32.bat"
与
call "D:\tools\Microsoft Visual Studio 11.0\VC\bin\x86_amd64\vcvarsx86_amd64.bat"
并像这样将 AMD64 添加到 nmake 命令中
nmake -nologo -f makefile.vc release OPTS=%OPTS% %1 MACHINE=AMD64
在 buildall.vc.bat 中似乎已经修复了它。
关于c++ - 针对自定义构建的 tcl85.lib 的链接器错误,适用于 ActiveState 分发的 tcl85.lib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21226265/