ODBC отказывается статически ссылаться на libcmt.lib под VS2010 - PullRequest
2 голосов
/ 04 января 2011

Существует короткий ответ от Microsoft по этому вопросу:

https://connect.microsoft.com/VisualStudio/feedback/details/470376/odbc-application-linking-with-odbccp32-lib-gets-link-errors-in-vs2010-beta-1?wa=wsignin1.0#tabs

По сути, их ответ, похоже, не решает проблему.

Наше приложение должно статически ссылаться на библиотеки C, но при попытке сделать это возникает ошибка компоновщика. Похоже, что ответ Microsoft - «динамически связывать», но это не вариант. Их альтернатива - «использовать версию odbccp32.lib, поставляемую с Vista SDK». Однако я не знаю, как заставить VisualStudio 2010 использовать другую версию библиотеки ODBC?

Я только что провел последний час, пытаясь найти все возможные варианты поиска в файлах .vcxproj и .sln для любых ссылок на odbccp32.lib. Никто. Я так же искал ODBC. Никто. Рассматривая все опции компилятора и компоновщика для рассматриваемого проекта (ов): ничто не относится к ODBC вообще. Единственное соединение между нашим приложением и ODBC, которое я вижу, это #include и . Однако даже эти файлы не ссылаются на odbccp32.lib (или любую другую опцию .lib или linker).

Единственные ссылки на odbccp32.lib, которые я вообще могу найти, находятся в файлах .obj. Таким образом, кажется, что VS2010 автоматически знает, с какими библиотеками ODBC связываться, основываясь на том, на какие функции ссылается наше программное обеспечение (например, SQLConnect ()).

Так как я могу:

1) "получить версию odbccp32.lib для Vista SDK"?

2) заставить VS2010 связываться с этой версией?

1020 * -ИЛИ- *

Есть ли лучший способ решить это ?! В настоящее время я не могу перейти к преобразованию нашего программного обеспечения с VS2008 -> 2010, если я не смогу найти способ заставить эту глупую программу скомпилироваться.

ПРИМЕЧАНИЕ. По-видимому, я мог бы заставить систему компилироваться с использованием инструментов 2008 года, что может «вылечить» это. Но это означает изменение всех наших проектов вверх и вниз по цепочке, чтобы сделать это, что довольно далеко назад и противоречит всему смыслу перехода к 2010 году, не так ли?

Для любопытных, точная ошибка компоновщика:

odbccp32.lib(dllload.obj) : error LNK2019: unresolved external symbol __imp___vsnprintf referenced in function _StringVPrintfWorkerA@20

Ответы [ 5 ]

2 голосов
/ 17 мая 2016

Я только что столкнулся с неопределенным символом __imp___vsnprintf при преобразовании приложения ODBC в Visual Studio 2015. Убедившись в необходимости обходного пути, я сбросил все символы, экспортированные различными библиотеками, в каталогах LIB Visual Studio 2015 с помощью DUMPBIN иобнаружил, что эта библиотека с наиболее очевидным именем, legacy_stdio_definitions.lib, определяет эти символы.

Добавление этого в командную строку LINK разрешило отсутствующий внешний источник, на который ссылается odbccp32.lib.

Как только кто-то знает, что искать, некоторая информация доступна здесь .

2 голосов
/ 04 января 2011

Читая вашу ссылку, кажется, что Microsoft подтвердила, что есть проблема, и они намереваются исправить ее в следующей версии SDK. Много не помогает, не так ли?

Вполне нормально, что компоновщик последовательно соединяет объекты, связывая один объект, только чтобы обнаружить, что он имеет зависимости от других объектов. Если вы хотите предварительно связать ссылку с определенной библиотекой, добавьте ее в «Дополнительные зависимости» на вкладке «Входные данные компоновщика» свойств проекта.

Если вы не можете заставить компоновщик предпочесть конкретную версию библиотеки, просто найдите и замените версию библиотеки в установке.

Я думаю, что это ссылка на Vista SDK, но я не могу проверить это: http://www.microsoft.com/downloads/en/details.aspx?FamilyID=ff6467e6-5bba-4bf5-b562-9199be864d29&displaylang=en

2 голосов
/ 04 января 2011

Я вижу это.О, мои соболезнования.Их советы настолько хороши, насколько это возможно, если вы не хотите компилировать с / MD.Я думаю, что знаю источник проблемы, это не так легко исправить для них.Им потребуется сначала исправить файл заголовка CR201 VS2010, а затем перекомпилировать и выпустить обновление SDK.Это требует некоторых важных действий.

Он становится связанным, поскольку он указан в списке свойств «Основные библиотеки Windows».View + Property Manager, чтобы увидеть его.Не связывать это не вариант, вы, вероятно, фактически используете его, когда #include <sql.h>

В версии Vista действительно нет той же проблемы, вероятно, она была построена с более ранней версией VS.Project + Properties, Linker, Input, Additional Dependencies = "c: \ program files \ microsoft sdks \ windows \ v6.0a \ lib \ odbccp32.lib".Это добавляет версию Vista до версии 7.0.Возможно, вам придется с этим смириться некоторое время, не забудьте установить VS2008 на свои сборочные машины.

1 голос
/ 04 января 2011

Не знаю всех деталей, поэтому стреляю в темноте.Когда у меня возникла ситуация, когда определенные функции были доступны с одним компилятором, а не с другим, я создал простую DLL-библиотеку с функциями, экспортированными через интерфейс C, используя версию компилятора, которая поддерживала эти функции, и использовал эту DLL-библиотеку с другим компилятором.

0 голосов
/ 21 сентября 2013

решение состоит в том, чтобы связать только с odbccp32.lib из v6.0 sdk, все остальное из sdk по умолчанию.

1. скачать v6.0 sdk из: http://www.microsoft.com/downloads/en/details.aspx?FamilyID=ff6467e6-5bba-4bf5-b562-9199be864d29&displaylang=en

(не устанавливайте документацию и образцы / примеры, результат будет загружен 75 МБ):

2. создать папку, какую-нибудь папку.

например: lib_odbc_fromsdkv6.0 в папке вашего проекта

3. скопируйте файл odbccp32.lib из:

C:\Program Files\Microsoft SDKs\Windows\v6.0\Lib

в созданную выше папку (только один файл).

4. в свойствах каждого проекта добавьте этот каталог (lib_odbc_fromsdkv6.0) в каталоги библиотеки:

VC++ Directories -> Library directories

зависимые проекты в myodbc: myodbc5S и myodbc-installer.

(из Мордачай)

...