c++ - 如何通过命令行设置 VC++ 动态链接?

标签 c++ visual-c++ dll dynamic-linking cl

虽然我通过 Visual Studio 设置运行时 DLL 加载没有问题,但通过 Visual Studio CLI 工具手动执行时我遇到了一些问题。

假设我们有以下 2 个我们想要编译的简单 C++ 源文件,一个用于二进制可执行文件,一个用于 DLL:

main.cpp

void say_hello();

int main()
{
    say_hello();
    return 0;
}

say_hello.cpp

#include <stdio.h>

void say_hello()
{
    printf("Hello DLL World!");
}

say_hello.cpp 文件编译为 DLL 然后将其与 main.cpp 的调用动态链接的步骤是什么?

根据我通读的 MSDN 文档,我能够成功编译 say_hello.dll 和应用程序,然后运行它并使用以下命令:

cl say_hello.cpp /LD
lib say_hello.obj
cl say_hello.lib main.cpp

不幸的是,这似乎只允许通过 say_hello.lib 文件静态链接应用程序(可以通过删除 .lib 和 .dll 文件来确认,这仍然允许二进制文件运行成功)。

我必须将哪些命令/参数传递到编译/链接阶段才能让 main.exe 使用 DLL 而不是静态库?

最佳答案

这是一个例子。并非每件事都是完全必要的(例如 DLLMain),但我认为这些是您应该查找的东西 ;-)

问好.cpp

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdio.h>

// see https://msdn.microsoft.com/en-us/library/56h2zst2.aspx : Decorated Names
extern "C" {  // somehow making it superfluous to put the code in SayHello.cPP ...but anyway ;-)
    // see https://msdn.microsoft.com/en-us/library/3y1sfaz2.aspx : dllexport, dllimport
    __declspec(dllexport) void say_hello()
    {
        printf("Hello DLL World!");
    }

  // see https://msdn.microsoft.com/en-us/library/windows/desktop/ms682583%28v=vs.85%29.aspx : (optional) DllMain entry point
    BOOL WINAPI DllMain(HMODULE hModule,
        DWORD  ul_reason_for_call,
        LPVOID lpReserved
        )
    {
        switch (ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
        }
        return TRUE;
    }
}

主要.cpp

extern "C" { __declspec(dllimport) void say_hello(); }  // we did this in SayHello.cpp, so we have to do it here too.
// otherwise the name wouldn't match

int main() {
    say_hello();
    return 0;
}

然后编译/链接

cl /D_USRDLL /D_WINDLL SayHello.cpp /LD /link /OUT:SayHello.dll

/LD 告诉链接器构建一个 DLL 以使用/MT,参见 /MD, /MT, /LD (Use Run-Time Library) . (通过 OUT: 参数,您可以更改 .dll 的名称;这里是默认名称,仅用于演示目的。如果您省略它,您也可以跳过/link 参数,因为那里会不再是链接器参数。)

cl.exe /MT main.cpp /link /SUBSYSTEM:CONSOLE "SayHello.lib" 

匹配 dll 的运行时库设置,创建 console application (main.cpp 有一个 int main())并链接 SayHello 的 stub 库(而不是使用 LoadLibrary("SayHello.dll")/GetProcAddress(...) )

关于c++ - 如何通过命令行设置 VC++ 动态链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36610775/

相关文章:

c++ - Qt QPainter 以毫米而不是英寸为单位

.net - 我是否需要 .NET Framework 2.0 SDK 才能使用基于 .NET 的编译器从命令行进行编译

visual-studio-2010 - 相当于 MSVC 中的 pread/pwrite?

c++ - temp2->next 包含什么?

r - 无法在 Windows 上加载 Haskell dll

c++ - 外部打印函数如何编译

c++ - 信号处理程序中不允许使用对象或函数

c++ - 如何调整结构元素数组的大小

c# - 如何安装 Visual Studio dll 文件?

javascript - 在 ASP.NET MVC 项目中使用类库中的 Javascript 文件