我有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>
怎么做?
答案 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。
其他包含和库路径;
在为其他构建分发这些输出时,可能需要在目标构建中包含其他头和库路径。要向包含和库搜索路径添加其他位置,可以将环境变量(INCLUDE
和LIB
)添加到(按用户或系统范围),但也可以在命令中指定行,通过/I
和/LIBPATH
,如下所示;
cl /IC:\Code\include [additional options] main.cpp
link /LIBPATH:C:\Code\lib [additional options] xyz.lib
准则;
您的错误LNK1104
我怀疑你的错误LNK1104很可能是因为你的用户没有足够的权限来编写" Program Files"目录。否则,对目标使用不正确的工具链可能会出错(x86与x64)。
通常最好在你自己的目录中这样做;例如:" C:\ Code \ bgi" 。
答案 1 :(得分:1)
现代C ++编译器将嵌入有关所需库的信息。对于visual studio,.obj文件包含对它所依赖的C ++库的引用(/ MT / MD / MTd / MDd),这些库的实现略有不同,并且与它们不兼容。唯一的选择是为每个支持的构建模式提供源代码或多个.obj文件