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

标签 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>

怎么做?

最佳答案

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

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++ build设置正确的环境。确保为 x86 或 x64 目标匹配正确的工具链。
  • 导航到包含目标文件的目录。
  • 运行您拥有的命令(如上)。

  • 你的错误 LNK1104

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

    通常最好在您自己的目录中执行此操作;例如:“C:\Code\bgi”。

    关于c++ - 如何从 Visual C++ 的 .obj 文件构建静态和动态库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31763558/

    相关文章:

    c++ - 条件运算和花括号会影响代码吗?

    c++ - 基于范围的 for 语句中的 GCC 错误

    .net - 未找到 DllRegisterServer 入口点 - 注册 Vb.NET DLL 时?

    .net - CLR SQL 程序集 : Get the Bytestream?

    c++ - C++(和 C)类型转换期间明显不一致

    c++ - 如何将代码与 virtualbox 集成?

    qt - 在 DLL 中包含 Qt 头文件

    c++ - 在不重新链接的情况下更新依赖于 Boost 库的库的 Boost 版本

    c# - Visual Studio 设计器总是试图更改我的控件

    c# - VS 2008 - 明星团队和多项目解决方案?