虽然我通过 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/