代码之家  ›  专栏  ›  技术社区  ›  Apocalisp

DLL链接器问题

  •  3
  • Apocalisp  · 技术社区  · 15 年前

    我正在编译一个dll两次(一次用于x86,一次用于x64),我已将/entry设置为“dllmain”。我正在使用/mt运行库选项静态链接运行库。这一切在执行x86生成时都可以正常工作,但x64生成失败,原因如下:

    error LNK2019: unresolved external symbol main referenced in function __tmainCRTStartup
    {project directory}\LIBCMT.lib(crt0.obj)
    

    为什么这适用于x86版本而不是x64版本?我这里有什么东西不见了吗?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Community CDub    8 年前

    不是一个直接的答案,但它可能是严格相关的:正如评论中所说,您应该避免这样改变入口点:通常,实际入口点由CRT提供的“假”dllmain获取,以初始化其内部数据结构(如解释所示 here ,所以你绕过了它。可能是由于删除了CRT初始化代码而导致大小减小。

    您的DLL正在使用一个未初始化的CRT,这是非常糟糕的。您应该离开默认的入口点,顺便说一下,它可以解决您的问题。

    顺便说一下,注意你 能够 在没有CRT的情况下生成一个DLL(它会变得非常小),但不应该使用CRT 完全 ,甚至没有链接到它( /NODEFAULTLIB 开关)。这意味着您可以只使用显式链接的库(例如Windows API),但我怀疑您会丢失几个C++特性(我认为至少例外和RTTI)。

        2
  •  0
  •   RichieHindle    15 年前

    这可能是一个愚蠢的问题,但您确定在x64情况下链接为一个dll(即指定 /DLL 开关)-因为投诉是关于 main ,我想知道它是否正在尝试作为可执行文件进行链接?