ODBC拒绝静态链接到VS2010下的libcmt.lib

时间:2011-01-04 16:56:52

标签: c++ visual-studio-2010 linker-errors

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库,但尝试执行此操作时会出现链接器错误。微软的答案似乎是“动态链接”,但这不是一个选择。他们的另一种选择是“使用Vista SDK附带的odbccp32.lib版本”。但是,我不知道如何强制VisualStudio 2010使用不同版本的ODBC库?

我花了最后一小时尝试通过.vcxproj和.sln文件进行所有可能的搜索,以获取对odbccp32.lib的任何引用。没有。我同样寻找ODBC。没有。看着所有的编译器和放大器有问题的项目的链接器选项:没有任何东西是指ODBC。我可以看到我们的应用程序和ODBC之间唯一的连接是#include< sql.h>和< sqlext.h>。但是,即使这些文件也没有引用odbccp32.lib(或任何其他.lib或链接器选项)。

对odbccp32.lib的唯一引用我可以找到.obj文件。因此,VS2010似乎根据我们软件中引用的功能(例如SQLConnect())自动知道链接哪些ODBC库。

那我怎么可能:

1)“获取odbccp32.lib的Vista SDK版本”?

2)导致VS2010与该版本链接?

-OR -

有没有更好的方法来解决这个问题?!现在我无法继续从VS2008转换我们的软件 - > 2010除非我能找到一种方法来强制这个愚蠢的软件进行编译。

注意:显然我可以使用2008的工具强制系统编译,这可能会“治愈”这个。但这意味着要改变我们所有的项目。在链条上做这件事,这是倒退而且与转向2010年的整个观点相反,不是吗?

对于好奇的,确切的链接器错误:

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

5 个答案:

答案 0 :(得分:2)

通过链接阅读,似乎Microsoft已经验证存在问题,并且他们打算在SDK的 next 版本中修复它。没有多大帮助,是吗?

链接器通过对象进行菊花链连接是很正常的,只链接一个对象以发现它依赖于其他对象。如果要抢先链接到特定库,请将其添加到项目属性的“链接器输入”选项卡中的“附加依赖项”。

如果您无法让链接器更喜欢特定版本的库,只需在安装中找出并替换库的版本。

我认为这是Vista SDK的链接,但我无法验证它:http://www.microsoft.com/downloads/en/details.aspx?FamilyID=ff6467e6-5bba-4bf5-b562-9199be864d29&displaylang=en

答案 1 :(得分:2)

我明白了。哎哟,我的哀悼。如果你不想用/ MD编译,他们的建议是最好的。我想我知道问题的根源,这也不是那么容易解决的问题。这将要求他们首先修复VS2010 CRT头文件,然后重新编译并发布SDK更新。这需要一些重要的工作。

它已被链接,因为它列在“核心Windows库”属性表中。查看+物业经理查看。不链接它不是一个选项,你可能实际上在#include <sql.h>

时使用它

Vista版本确实没有同样的问题,它可能是用早期版本的VS构建的。 Project + Properties,Linker,Input,Additional Dependencies =“c:\ program files \ microsoft sdks \ windows \ v6.0a \ lib \ odbccp32.lib”。这会在7.0版本之前注入vista版本。您可能需要使用一段时间,请务必在构建计算机上安装VS2008。

答案 2 :(得分:2)

我在将ODBC应用程序转换为Visual Studio 2015时遇到了未定义的__imp___vsnprintf符号。确定必须有一个解决方法,我将各个库导出的所有符号转储到Visual Studio 2015 LIB目录中DUMPBIN并发现这个名称最明显的legacy_stdio_definitions.lib库定义了这些符号。

将此添加到LINK命令行解决了odbccp32.lib引用的缺失外部问题。

一旦知道要搜索什么,some info is available here

答案 3 :(得分:1)

不知道所有的细节,所以在黑暗中拍摄。当我遇到某个编译器而不是另一个编译器可用的情况时,我创建了一个简单的DLL,其中的函数使用C接口导出,使用支持这些函数的编译器版本,并将该DLL与另一个编译器一起使用。

答案 4 :(得分:0)

解决方案是从默认的sdk中的v6.0 sdk链接odbccp32.lib。

<强> 1。从http://www.microsoft.com/downloads/en/details.aspx?FamilyID=ff6467e6-5bba-4bf5-b562-9199be864d29&displaylang=en

下载v6.0 sdk

(不要安装文档和示例/示例,结果是75MB下载):

<强> 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。

(来自Mordachai)