2012-03-19 109 views
0

我正在使用CreateProcess来调用cllink来编译并链接另一个C++程序(TestProg.cxx)为DLL。如何在运行时编译C++程序并将其链接到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 

可否请你让我知道如何解决它?谢谢

+0

我的猜测是你看到了C++的名字的问题。 – 2012-03-19 11:18:02

+2

不太可能; 'extern“C”'是表明你想要C而不是C++名字的正确方法。但是即使C的名字已经改变,正如你可以从领先的'_' – MSalters 2012-03-19 11:54:14

+0

酷信息中看到的,谢谢。 – 2012-03-19 11:57:45

回答

1

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

+0

感谢您的评论。我在copmilation选项上使用'/ LD'测试了我的代码,在链接选项上有和没有'/ DLL'选项,我得到了相同的链接错误。没有两个我得到错误'LINK:致命错误LNK1221:一个子系统不能推断,必须定义'。使用'/ SUBSYSTEM'链接选项似乎是错误的,因为它:'告诉操作系统如何运行.exe文件',但是当我添加它时,再次出现相同的链接错误。请让我知道如何添加CRT(我没有找到一个/ CRT选项)。谢谢! – ZOK 2012-03-19 15:53:45

+0

@ZOK:通常的解决方案是将'/ MT'传递给_compiler_。有多种版本的CRT,链接器的选择应该与编译器匹配。因此,链接器从.obj文件中读取编译器的内容。但正如我早些时候已经告诉你的那样,您可能不应该调用班轮,并将其留给CL.exe – MSalters 2012-03-19 16:09:37

+0

感谢您的评论。我没有调用链接器,我把它留给'cl'。路过'/ MT'编译器,我得到了错误:'LINK:致命错误LNK1221:一个子系统无法推断,而且必须defined'。将'/ SUBSYSTEM:WINDOWS'传递给链接器会再次出现3个链接错误。请让我知道如何解决这个问题。谢谢! – ZOK 2012-03-19 17:14:38