【问题标题】:Linking lots of .libs to make a DLL: unresolved external symbol _DllMainCRTStartup链接大量 .lib 以创建 DLL:未解析的外部符号 _DllMainCRTStartup
【发布时间】:2013-07-17 18:47:06
【问题描述】:

我正在执行在 Windows 上构建 LLVM 3.3 的(可怕的)任务,我已经到了拥有大量 LLVM*.lib 文件的阶段。我想将它们链接到一个巨大的共享 DLL,但我很挣扎(这是我第一次在 Windows 上链接东西)。我试过了:

link /DLL /MACHINE:X64 /OUT:LLVM3.3.dll LLVM*.lib

但无济于事。它错误:

LINK : warning LNK4001: no object files specified; libraries used
LINK : error LNK2001: unresolved external symbol _DllMainCRTStartup
LLVM3.3.dll : fatal error LNK1120: 1 unresolved externals

互联网建议添加/DEFAULTLIB:corelib 开关,所以我这样做了,但又出现了问题:

> link /DLL /MACHINE:X64 /DEFAULTLIB:corelibc /OUT:LLVM3.3.dll LLVM*.lib

LINK : warning LNK4001: no object files specified; libraries used
LINK : fatal error LNK1104: cannot open file 'corelibc.lib'

我该怎么做?


编辑:我设法解决了上述问题,方法是实现一个空的DllMain 并从中创建一个EmptyDllMain.obj

#include <windows.h>

BOOL APIENTRY DllMain( HANDLE hModule, 
                   DWORD  ul_reason_for_call, 
                   LPVOID lpReserved
                 )
{
    return TRUE;
}

然后尝试:

link /DLL /OUT:LLVM3.3.dll LLVM*.lib EmptyDllMain.obj

但我得到的 DLL 只有 8kb - 它似乎错过了许多兆字节的 LLVM 库!如何让它们包含在内?


EDIT2:我解决了Windows上的LLVM编译问题,看看这个document on github

【问题讨论】:

  • DLL 很小的原因是 lib 文件仅在需要满足引用时才链接。你没有任何东西——所以没有任何联系。选项有 1. 写一个 DEF 文件来创建引用; 2.使用-WHOLEARCHIVE:&lt;lib&gt;

标签: dll build linker


【解决方案1】:

我曾经在将一个库与错误的平台集(X86 到 X64)链接时遇到过这种情况。确保所有 LLVM*.lib 都已构建并使用正确的工具链链接:

[...]\Microsoft visual Studio 10.0\VC\bin\amd64\ cl.exe and link.exe

你通过调用得到的

"%PROGRAMFILES(X86)%\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" amd64

我在混合MT和MD CRT时也遇到过类似的问题,我建议你坚持

/MD (or /MDd for debug) 

在编译任何 LLVM*.lib 的对象时(以及您链接到这些的其他外部库中的任何其他对象)。

[编辑]

然后踢掉那个丑陋的 EmptyDllMain.obj !

[/编辑]

【讨论】:

  • 我遇到了同样的问题,这让我发疯了。就我而言,“C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat”amd64_x86 是重置工具链的诀窍。
  • "然后踢掉那个丑陋的 EmptyDllMain.obj " 那么如何解决链接器错误呢?
【解决方案2】:

如果您手动输入了_DllMainCRTStartup,请确保拼写正确(表壳)。我有_DLLMainCRTStartup 并花了一段时间才明白为什么我仍然收到链接器错误。对于 Windows CE,所需的链接库是 corelibc.lib

【讨论】:

  • 很好的答案,但是 Visual c++ 6.0 及以下版本的库是什么(corelibc 有另一个名称)
【解决方案3】:

从项目属性的“链接器->输入”中的“忽略特定默认库”中删除 lib 文件

【讨论】:

    猜你喜欢
    • 2023-03-20
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 2016-08-26
    • 1970-01-01
    • 2012-03-03
    相关资源
    最近更新 更多