【问题标题】:How to compile and link a C++ program into a DLL in runtime如何在运行时将 C++ 程序编译并链接到 DLL 中
【发布时间】:2012-03-19 09:37:42
【问题描述】:

我正在使用CreateProcess 调用cllink 来编译并将另一个C++ 程序(TestProg.cxx) 链接到一个DLL 中。

TestProg.cxx 包含以下DllMain 函数:

extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
    return TRUE;
}

我在链接选项中添加了/Entry:DllMain

我收到以下链接错误:

LINK : error LNK2001: unresolved external symbol _DllMain

main.obj : error LNK2001: unresolved external symbol __RTC_Shutdown

main.obj : error LNK2001: unresolved external symbol __RTC_InitBase

main.dll : fatal error LNK1120: 3 unresolved externals

你能告诉我如何解决它吗?谢谢

【问题讨论】:

  • 我的猜测是你看到了 C++ 的名称修改问题。
  • 不太可能; extern "C" 是表明您想要 C 而不是 C++ 名称修改的正确方法。但即使是 C 也有名称修饰,正如您从领先的 _ 中看到的那样

标签: c++ dll linker createprocess entry-point


【解决方案1】:

您缺少 CRT(C 运行时库)。例如,它提供了__RTC_Shutdown 函数。当您链接它时,它会在您的 DllMain 之前通过包装它开始。这也将解决您的第一个链接错误。

【讨论】:

  • 感谢您的评论。我在编译选项上使用/LD 测试了我的代码,在链接选项上有和没有/DLL 选项时,我得到了相同的链接错误。没有这两个我得到错误LINK : fatal error LNK1221: a subsystem can't be inferred and must be defined。使用/SUBSYSTEM 链接选项似乎是错误的,因为它:Tells the operating system how to run the .exe file,但是当我添加它时,再次出现相同的链接错误。请让我知道如何添加 CRT(我没有找到 /CRT 选项)。谢谢!
  • @ZOK:通常的解决方案是将/MT 传递给编译器。 CRT 有多个版本,链接器选择应与编译器匹配。因此,链接器从 .obj 文件中读取编译器所做的事情。但正如我之前已经告诉过你的,你可能无论如何都不应该调用衬里并将其留给 CL.exe
  • 感谢您的评论。我不调用链接器,我把它留给cl。将/MT 传递给编译器,我得到了错误:LINK : fatal error LNK1221: a subsystem can't be inferred and must be defined。将/SUBSYSTEM:WINDOWS 传递给链接器会再次带来3 个链接错误。请让我知道如何解决这个问题。谢谢!
  • 最简单的方法是创建一个简单的 Visual Studio DLL 项目。 Visual Studio 将向 CL 显示有效的命令行参数。
猜你喜欢
  • 1970-01-01
  • 2023-01-26
  • 1970-01-01
  • 2014-01-27
  • 2018-05-10
  • 1970-01-01
  • 2017-08-24
  • 2013-10-04
  • 2022-11-13
相关资源
最近更新 更多