作为学习C ++的一部分,我编写了一个引用它的简单类库+应用程序。所有内容都构建,除了类库不生成.lib文件,这导致应用程序抛出“LINK:致命错误LNK1104:无法打开文件”。这似乎很合理;很明显,如果没有必要的文件,则会出现错误,这是致命的。 (旁注:我还没有书)
所以,我去查找可能无法生成.lib文件的原因。顺便说一句,我的搜索功能相当薄弱。我所做的就是,如果库没有任何__declspec(dllexport)标签,它就不会导出.lib。
我现在将发布类库的头文件和.cpp内容(一个简单的“Console”类,其中包含一个“Write(std :: string)”方法)。
部首:
// Extensions.h
#pragma once
#include "stdafx.h"
namespace Extensions {
__declspec(dllexport) class Console
{
public:
__declspec(dllexport) static void Write(std::string text);
};
}
我不确定在标记类时是否需要标记该函数,但我可以在它工作时检查它。
.cpp文件:
// This is the main DLL file.
#include "stdafx.h"
// #include "Console.h"
namespace Extensions {
void Console::Write(std::string text)
{
std::cout << text.c_str();
}
}
我已经检查过并设置为生成动态链接库。
感谢。
答案 0 :(得分:25)
以下是一些示例代码,演示如何正确导出类。注意CONSOLETEST_EXPORT宏。这是解决方案中缺少的部分。您需要在DLL项目中定义此宏,并在引用此DLL的项目中将其保留为未定义。
// MAIN.CPP - TestApplication
#include <iostream>
#include "ConsoleTest.h"
int main(int argc, char** argv)
{
std::cout << "Hello World" << std::endl;
ConsoleTest test;
test.Write();
ConsoleTest::StaticWrite();
system("pause");
}
// ConsoleTest.h - TestDll
#include <iostream>
#ifdef CONSOLETEST_EXPORT
#define CONSOLETEST_API __declspec(dllexport)
#else
#define CONSOLETEST_API __declspec(dllimport)
#endif
class CONSOLETEST_API ConsoleTest
{
public:
ConsoleTest();
~ConsoleTest();
void Write();
static void StaticWrite();
};
// ConsoleTest.cpp - TestDll
#include "ConsoleTest.h"
ConsoleTest::ConsoleTest()
{
}
ConsoleTest::~ConsoleTest()
{
}
void ConsoleTest::Write()
{
std::cout << "Instance Write" << std::endl;
}
void ConsoleTest::StaticWrite()
{
std::cout << "Static Write" << std::endl;
}
有关详细信息,请查看有关codeproject的这篇文章。 HowTo: Export C++ classes from a DLL