我跟随microsoft documentation并偶然发现DLL项目应像这样编译:
1>------ Build started: Project: MathLibrary, Configuration: Debug Win32 ------
1> stdafx.cpp
1> dllmain.cpp
1> MathLibrary.cpp
1> Creating library c:\users\username\documents\visual studio 2015\Projects\MathLibraryAndClient\Debug\MathLibrary.lib and object c:\users\username\documents\visual studio 2015\Projects\MathLibraryAndClient\Debug\MathLibrary.exp
1> MathLibrary.vcxproj -> c:\users\username\documents\visual studio 2015\Projects\MathLibraryAndClient\Debug\MathLibrary.dll
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
但是我成功编译了DLL项目,但是输出却少了。结果导致我的主应用程序无法编译,因为如编译器所说的那样,“您的DLL中没有.lib文件。”
DLL项目的输出如下:
1>------ Rebuild All started: Project: testDLL, Configuration: Debug Win32 ------
1>stdafx.cpp
1>dllmain.cpp
1>someClass.cpp
1>testDLL.cpp
1>Generating Code...
1>testDLL.vcxproj -> D:\stud\VStest\testDLL\Debug\testDLL.dll
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========
我的输出显然缺少“创建库”部分。我不明白怎么了,我的VS是2017。
P.S。 MS在CPP文件中的注释是什么意思?
// Compile by using: cl /EHsc /DMATHLIBRARY_EXPORTS /LD MathLibrary.cpp
答案 0 :(得分:2)
在您的DLL项目中转到
项目设置-> C / C ++->预处理器->预处理器定义
并添加
MATHLIBRARY_EXPORTS 定义
所以MATHLIBRARY_API
宏
#ifdef MATHLIBRARY_EXPORTS
#define MATHLIBRARY_API __declspec(dllexport)
#else
#define MATHLIBRARY_API __declspec(dllimport)
#endif
将被解析为__declspec(dllexport)
。这将指示编译器/链接器将标有该属性的函数导出到DLL导出部分以及导入库中(如果您将项目设置为create import library)。
此外,您可以按照以下方式实现您的类:
namespace MathLibrary
{
// This class is exported from the MathLibrary.dll
class MATHLIBRARY_API Functions
{
public:
// Returns a + b
static double Add(double a, double b);
// Returns a * b
static double Multiply(double a, double b);
// Returns a + (a * b)
static double AddMultiply(double a, double b);
};
}
或者,您可以使用def files代替__declspec