编译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的主要内容,如果未能解决你的问题,请参考以下文章
LinkedList 实现 C++ 的编译器错误 LNK2019