Ошибки компоновщика для пользовательской сборки tcl85.lib, работает с дистрибутивом ActiveState tcl85.lib

Мы создаем Tcl сами, чтобы распространять наши собственные скомпилированные двоичные файлы с приложением. Само приложение связывается с библиотекой Tcl и использует внутренний API.

Для сборки Tcl мы взяли исходники с http://sourceforge.net/projects/tcl/, мы затем перейдите в каталог /win, измените файл buildall.vc.bat, чтобы он указывал на нашу установку MSVC, а затем запустите этот файл bat. Сборка работает, как и ожидалось, и выходные данные создаются в /win/Release_VC11. В частности, создаются tcl85.lib и tcl85.dll.

Когда мы связываемся с этим .lib из нашего приложения Qt C++, мы получаем кучу ошибок компоновщика. Например:

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)

Однако, когда мы связываемся с файлом tcl85.lib, предоставленным как часть дистрибутива ActiveState Tcl, компоновщик не имеет никаких проблем и строится нормально. Мы убедились, что в обоих случаях это одна и та же версия 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

Мы пробовали все виды вещей без везения.


person Jaco Naude    schedule 20.01.2014    source источник
comment
Похоже, разные варианты в отношении библиотек ссылок, о которых я мало знаю (я работаю на разных платформах).   -  person Donal Fellows    schedule 20.01.2014
comment
Просто мысль: вы компилируете библиотеки ActiveTcl или те, которые вы сделали из исходников? IIRC, вы должны ссылаться на те, которые вы компилируете…   -  person Donal Fellows    schedule 20.01.2014


Ответы (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, похоже, это исправлено.

person Jaco Naude    schedule 21.01.2014
comment
Оооо, 32бит/64бит точно подойдет. - person Donal Fellows; 21.01.2014