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

How to build static and dynamic libraries from .obj files for Visual C++?

我有 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>

怎么做?

是的,你可以做到,几乎就像你拥有的那样。

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

LIB (lib.exe) is used to create static libraries. 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库)。

在这种情况下;这似乎是正确的 linker 参数;

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

注意:构建的object文件是调试版本,因此MSVCRTD.lib(注意D)是此处使用的文件。使用上面的命令,我已经能够成功 link .dll 和静态 .lib.

额外的包含和库路径;

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

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

准则;

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

你的错误LNK1104

我怀疑您遇到的错误 LNK1104 很可能是因为您的用户没有足够的权限在 "Program Files" 目录中写入文件。否则,为您的目标使用不正确的工具链可能会出错(x86 与 x64)。

一般最好在自己的目录下进行;例如:"C:\Code\bgi".

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