如何从Visual C ++的.obj文件构建静态和动态库?

时间:2015-08-01 16:05:36

标签: c++ dll visual-studio-2008 .lib

我有Visual Studio 2008,Windows7 64位。

我正在使用WinBGIm图形库。

该库提供了一些.obj文件。没有.lib或.dll文件。

我想将它们转换为静态.lib和动态.dll文件。

我已将所有.obj文件复制到目录中:

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\amd64

但是,以下命令无效:

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\amd64>lib.exe /out:bgiout.lib *.obj
Microsoft (R) Library Manager Version 9.00.21022.08
Copyright (C) Microsoft Corporation.  All rights reserved.

LINK : fatal error LNK1104: cannot open file 'bgiout.lib'

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\amd64>

怎么做?

2 个答案:

答案 0 :(得分:22)

是的,你可以做到这一点,就像你拥有它一样。

C:\Code\bgi\obj>lib /out:libbgi.lib *.obj

LIB(lib.exe)用于创建静态库。 LINK(link.exe /DLL)用于创建动态库(它创建.dll和导入库.lib)。

C:\Code\bgi\obj>link /DLL /out:bgi.dll *.obj [additional libs]

使用link /DLL命令时,需要其他Win32和C ++标准运行时库(例如MSVCRT.lib和User32.lib等以及MFC库)。

在这种情况下;这似乎是正确的链接器参数;

C:\Code\bgi\obj>link /DLL /out:bgi.dll *.obj MSVCRTD.lib User32.lib Gdi32.lib ole32.lib Comdlg32.lib OleAut32.lib

注意:构建的目标文件是调试版本,因此MSVCRTD.lib(注意D)是这里使用的。通过上面的命令,我已经能够成功链接.dll和静态.lib。

其他包含和库路径;

在为其他构建分发这些输出时,可能需要在目标构建中包含其他头和库路径。要向包含和库搜索路径添加其他位置,可以将环境变量(INCLUDELIB)添加到(按用户或系统范围),但也可以在命令中指定行,通过/I/LIBPATH,如下所示;

cl /IC:\Code\include [additional options] main.cpp
link /LIBPATH:C:\Code\lib [additional options] xyz.lib

准则;

  • 启动一个" Visual Studio"命令提示符,在2008年,开始菜单中应该有一个链接" Visual Studio 2008命令提示符"。此批处理文件将为C ++构建设置正确的环境。确保匹配x86或x64目标的正确工具链。
  • 导航到包含目标文件的目录。
  • 运行您拥有的命令(如上所述)。

您的错误LNK1104

我怀疑你的错误LNK1104很可能是因为你的用户没有足够的权限来编写" Program Files"目录。否则,对目标使用不正确的工具链可能会出错(x86与x64)。

通常最好在你自己的目录中这样做;例如:" C:\ Code \ bgi"

答案 1 :(得分:1)

现代C ++编译器将嵌入有关所需库的信息。对于visual studio,.obj文件包含对它所依赖的C ++库的引用(/ MT / MD / MTd / MDd),这些库的实现略有不同,并且与它们不兼容。唯一的选择是为每个支持的构建模式提供源代码或多个.obj文件