Dll函数的声明和实现未链接

问题描述 投票:0回答:1

我正在尝试使用此guide在VS2019中创建.dll和.lib文件,并以静态和动态方式加载我的库。我有一个名为dllSolution的dll项目。在我的dllSolution中,有标准的framework.h,pch.h,dllmain.cpp,pch.cpp和我的a.h文件:

#pragma once

#ifdef DLLSOLUTION_EXPORTS
#define DLLSOLUTION_API __declspec(dllexport)
#else
#define DLLSOLUTION_API __declspec(dllimport)
#endif  // !DLLSOLUTION_EXPORTS

#ifndef WINAPI
#define WINAPI __stdcall
#endif  // !WINAPI

extern "C" DLLSOLUTION_API int WINAPI a();

带有a.cpp:

#include "a.h"
#include "pch.h"

#ifndef WINAPI
#define WINAPI __stdcall
#endif  // !WINAPI

int WINAPI a() { return 10; }

但是当我构建这个项目时,它不会产生.lib文件,就好像没有从库中导出文件一样:

1>------ Rebuild All started: Project: dllSolution, Configuration: Debug Win32 ------
1>pch.cpp
1>a.cpp
1>dllmain.cpp
1>Generating Code...
1>dllSolution.vcxproj -> C:\CoolPathToMyDll\dllSolution\Debug\dllSolution.dll
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========

我尝试将实现移入dllmain.cpp,但没有结果。我也尝试过将ConfigurationType切换到StaticLibrary(.lib)并生成.lib,但是,当我将库静态链接到另一个项目并在main()中使用此a()时,它说:

error LNK2019: unresolved external symbol __imp__a@0 referenced in function _main

问题是什么,为什么会发生此问题?

c++ dll
1个回答
0
投票

正如@HansPassant承认的,问题是

pch.h的#include必须是第一个。按原样,它会跳过#include中的a.h(请注意警告),因此编译器不知道您尝试导出它。

在pch.h之前放置任何包含项会在VS2017中导致warning,但在VS2019中不会(在提出问题时)。

解释此行为的原因是here(简短版)和here(长版)。>>

希望此答案将帮助某人节省无用的更改链接选项的时间。

© www.soinside.com 2019 - 2024. All rights reserved.