代码之家  ›  专栏  ›  技术社区  ›  user82238

如何使用msvc从Windows中的命令行生成dll

  •  32
  • user82238  · 技术社区  · 15 年前

    我做C已经有20年了,但我从来没有建立过一个DLL;我一直喜欢静态链接。

    我使用命令行cl.exe等和gnumake makefiles来构建我的Windows应用程序。

    我现在想建立一个动态链接库,我很困惑。

    最后,我将得到一个.lib和一个.dll。lib包含存根代码,运行时加载dll并使用其中的代码。

    我一直在查看lib和link的命令行,我不清楚应该做什么来生成这个输出。

    所以我有一些问题;

    cl是否需要任何其他参数来指示它正在为dll编译?(我知道dll导出的原型需要uudeclspec(dllexport))。

    我知道link需要/dll作为参数。

    我会运行LIB吗? 链接,以分别生成.lib和.dll,还是链接将同时生成两者?

    我还需要知道什么?

    5 回复  |  直到 6 年前
        1
  •  34
  •   vaxquis user2577497    9 年前

    在命令行上使用:

    cl.exe /LD <files-to-compile>
    

    或者,如果您喜欢更详细和更明确的版本:

    cl.exe /D_USRDLL /D_WINDLL <files-to-compile> <files-to-link> /link /DLL /OUT:<desired-dll-name>.dll
    
        2
  •  3
  •   user82238    15 年前

    结果它是自动发生的。

    如果您有导出的函数(例如/export、uu declspec(dll export)等),链接器将自动生成.lib文件(当然您需要在链接器命令行上使用/dll)。

        3
  •  2
  •   eresonance    9 年前

    Simlar到Ebow Halm的答案,但使用.def文件列出导出的函数和更新的命令行参数:

    "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\vcvars32.bat" && cl /O2 /Iall /Iyour /Iincludes /D_USRDLL /D_WINDLL /DOTHER_DEFINES <libs> <source files> /LD /Fe<dll name> /link /DEF:<def name>.def
    

    参考文献:

        4
  •  1
  •   John Knoeller    15 年前

    cl是否需要任何其他参数来指示它正在为dll编译?(我知道dll导出的原型需要uudeclspec(dllexport))。

    既然Win3x不在,现在你只需要 __declspec(dllexport) 或.def文件,用于定义要导出的符号的名称。.def文件允许您导出具有修改名称的符号,因此在特殊情况下仍然有用。

    我知道link需要/dll作为参数。

    是的。

    我将运行lib和link分别生成.lib和.dll,还是link同时生成两者?

    lib仅用于创建静态库(或向implib添加.obj) 链接将为它生成.dll和import.lib。

        5
  •  0
  •   vaxquis user2577497    9 年前

    最简单的方法是创建一个MSVC项目,在该项目中您可以根据需要设置所有内容,然后启用生成日志记录,生成并分析所有命令及其参数的生成日志。