2013-06-22 2 views
1

http://community.activestate.com/node/7011Связывание с tcl85.lib с SWIG через МСВС (генерируется автоматически с помощью CMake)

Это вроде как тот бедняга Shang (можно использовать главу гендерно нейтрально?) Там в ссылке, за исключением того, что это еще один год, и у меня есть МСВС 2012.

подробности

CMake разместила C: ... \ Tcl \ Lib \ tcl85.lib в списке зависимостей для моего бинарная (я проверил в сгенерированном .vcproj файл - это там). Тем не менее, ошибки компоновщика многочисленны и формы:

nativeTCL_wrap.obj: ошибка LNK2019: неразрешенный внешний символ __imp__Tcl_ [некоторые-имя-команды] ссылается функция _SWIG_Tcl_ [некоторые-другие-command- имя].

Таким образом, я проверяю файл заголовка, как указано в списке зависимостей для моего проекта в MSVS: версия #define как 8.5. Это соответствует библиотеке, к которой я пытаюсь подключиться. Я попытался изучить tcl85.lib с помощью ходунки зависимостей. По-видимому, он не может исследовать этот файл. Я побежал dumpbin.exe на него ... И файл .lib имеет все недостающие функции, но в следующей форме:

__imp_Tcl_ [некоторые-имя-команды]

В нем есть все символы ... Но в каждом из них есть символ подчеркивания!

Затем я исследовал файл libtcl85.dll.a, данный Tcl дистрибутива ActiveState, используемый в Cygwin, а символы выглядят следующим образом:

__imp__Tcl_ [некоторое-имя-команда]

Итак, у есть дополнительное подчеркивание, и двоичные ссылки правильно на Cygwin.

...

Это серьезно один из тех моментов, когда я выбрасываю свои руки в воздухе и мышления, «Что делать?» во всей своей упрощенной грамматически прикрученной славе. Тот же файл интерфейса swig с тем же CMake генерирует модуль в Cygwin. Но разработка Cygwin - это боль в заднице из-за того, насколько он медленный (строит почти в 5-8 раз больше, чем в более родных системах Windows-ish).

Что происходит дальше?

Я пытаюсь убедить Swig генерировать с зависимостями с одним меньшим подчеркиванием? Если да, то как? Я сдаюсь и отправляю отчет об ошибке? Если да, то где? Это ошибка в ActiveState Tcl? Это ошибка в Swig? Разве это не ошибка, и я просто ввернута?

Из-за отсутствия подчеркивания королевство было потеряно?

ответ

1

Итак, когда я писал свой вопрос, я начал думать обо всех различных альтернативах тому, как это могло пойти не так. Затем я вспомнил, что CMake по умолчанию выбирает 32-битную версию MSVS. Теперь я чувствую себя довольно застенчивым, но, поскольку у кого-то, похоже, была аналогичная проблема на форумах ActiveState, я оставляю свой ответ здесь для тех, кому еще нужно это маленькое, крошечное, своеобразное напоминание ...

Как оказалось out, Выбор 64-разрядной версии MSVS с cmake -G "Visual Studio 2012 Win64" исправил все. Связывание работало нормально. Бинар успешно загрузился в Tclsh.

я бы ожидал более всеобъемлющее сообщение об ошибке от моего инструмента сборки о попытке связать 32-разрядные и 64-разрядные двоичные файлы вместе, хотя ...

+1

Множества инструментов получает значительно более сложным, когда вы получил несколько архитектур. В течение очень долгого времени это не было типичной проблемой для Windows, поэтому «мудрость сообщества» по этой теме довольно низкая, но в наши дни у вас есть 32-разрядная и 64-разрядная архитектуры в игре (оба поддерживаются компиляторами !), и поэтому уродливые детали обнажаются. (Вы не можете смешивать 32-битный и 64-битный код, вызывающие между ними, - в том же двоичном коде без трюков, далеко выходящих за пределы нормальных уровней, и мы, как правило, не будем беспокоиться о такой дикости в реализации Tcl ...) –

+0

Предположим, вы бы знали, является ли подчеркивающая вещь широко используемой деталью? Могу ли я увидеть его в других двоичных файлах? Знаешь, так что я мог бы раньше признать это раньше, а не набирать огромный подробный вопрос о том, чтобы понять, через несколько минут, что-то нехорошо глупо. > _ < – user

+0

@ DonalFellows Все еще узнает, как работает SO - так что, пожалуйста, простите теги с именами на месте. Я также не могу редактировать свои комментарии ... Фактическое содержимое сообщения находится в предыдущем сообщении. – user