编译dll但出现错误LNK2019

Posted

技术标签:

【中文标题】编译dll但出现错误LNK2019【英文标题】:complie dll but appear error LNK2019 【发布时间】:2018-01-10 07:36:29 【问题描述】:

我使用 vs2013 将 C++ 函数实现为 DLL。但是我有链接器错误(错误 LNK2019:未解析的外部符号 _main 在函数 ___tmainCRTStartup 中引用)构建到 dll。我有正确的设置,不知道出了什么问题。代码很简单,就是不知道为什么编译不成功。

Demoone.h

#ifndef _Demo_H_
#define _Demo_H_
#ifdef LIBDLL
#define LIBDLL extern "C" _declspec(dllimport)
#else
#define LIBDLL extern "C" _declspec(dllexport)
#endif
LIBDLL int Add(int plus1, int plus2);
#endif

Demoone.cpp

#include "Demoone.h"
int Add(int a, int b)

    return (a + b);

更新:

我修改了头文件如下

#ifndef _Demo_H_
#define _Demo_H_
extern "C" int Add (int a , int b);
#endif

并添加一个def文件

LIBRARY "Dllmaketwo"
EXPORTS
Add @ 1

同样的链接器错误(error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup)也出现了。

【问题讨论】:

查看 msdn 了解如何构建 dll。 也许您还需要一个 .def 文件。 @marshalcraft 我尝试了 .def 文件,但它不起作用(同样的错误)。 【参考方案1】:

如果您想在使用 DLL 的项目中使用加载时链接,您需要链接到由 DLL 项目构建生成的 .lib。

你可以这样做:

#pragma comment(lib, "dllproject.lib")

或者通过将 .lib 添加到 Linker->Input 下项目设置中的附加依赖项行。您可能还需要在 VC++ 目录页面或链接器->常规页面中弄乱库搜索路径。

【讨论】:

问题说这是构建 dll 的问题,而不是链接构建的 dll。【参考方案2】:
#ifndef _Demo_H_
#define _Demo_H_
#ifdef LIBDLLIMPORT //Changed here
#define LIBDLL extern "C" _declspec(dllimport)
#else
#define LIBDLL extern "C" _declspec(dllexport)
#endif
LIBDLL int Add(int plus1, int plus2);
#endif

您不应在#ifdef#define 中使用相同的名称,

您是否正确设置了项目?而且你不应该在里面写一个 `main()' 函数。

【讨论】:

@balthasar 正如您提到的external symbol _main referenced in function ___tmainCRTStartup),您是否正确设置了项目?请参阅我的更新答案。 我确定我的项目设置正确,并且错误信息提到了文件 LIBCMTD.lib(crt0.obj) 并且同样的代码可以在我朋友的电脑上成功运行;这让我很困惑。 @balthasar 您是否将整个解决方案复制到您朋友的计算机上?我仍然认为您没有正确设置项目。尝试谷歌LIBCMTD.lib(crt0.obj) error (error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup) 寻找解决方案。

以上是关于编译dll但出现错误LNK2019的主要内容,如果未能解决你的问题,请参考以下文章

LNK2019问题

“error LNK2019: 无法解析的外部符号”之分析

LinkedList 实现 C++ 的编译器错误 LNK2019

混合 C 和 C++ 时继续出现 LNK2019 错误

使用 C++ Dll 的 LNK2019 构造函数/析构函数

编译静态库遇到的 LNK2019 报错