动态链接库在编译时不生成 .lib 文件(Visual Studio C++ Express)
Posted
技术标签:
【中文标题】动态链接库在编译时不生成 .lib 文件(Visual Studio C++ Express)【英文标题】:Dynamic link library does not generate a .lib file when compiled (Visual Studio C++ Express) 【发布时间】:2011-02-16 17:25:49 【问题描述】:作为学习 C++ 的一部分,我编写了一个简单的类库 + 引用它的应用程序。一切都会构建,除了类库不生成 .lib 文件,这会导致应用程序抛出“LINK:致命错误 LNK1104:无法打开文件”。这似乎很合理;显然,如果没有必要的文件,就会出现错误并且是致命的。 (旁注:我还没有书)
所以,我开始寻找可能无法生成 .lib 文件的原因。顺便说一句,我的搜索功能很弱。我所发现的是,如果库没有任何 __declspec(dllexport) 标记,它就不会导出 .lib。
我现在将发布类库的标题和 .cpp 内容(一个简单的“控制台”类,带有一个“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();
我已经检查过了,它被设置为生成一个动态链接库。
谢谢。
【问题讨论】:
为什么 // #include "Console.h" 被注释掉了?那怎么编译? 它是“stdafx.h”中的#include'd。将其特别包含在“Console.cpp”中会导致“定义两次”错误。 【参考方案1】:这里是一些示例代码,演示了如何正确导出类。注意 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
【讨论】:
抱歉代码的格式很糟糕。该块中有三个单独的代码文件,main.cpp、ConsoleTest.h 和 ConsoleTest.cpp。 好多了。该应用程序现在抱怨控制台不存在(我将名称从 ConsoleTest 改回控制台,因为我有点 CDO)。该应用程序很好地包含“Console.h”,除了名称更改和包含“stdafx.h”(如果我忽略它,VSE 会抱怨)我正在使用您的代码。我是继续这个问题还是开始一个新问题? 没问题。解析成单独的文件似乎很容易。 您是否遇到编译错误或链接错误?并且您是否在您的 dll 项目的项目设置中定义了 CONSOLETEST_EXPORT? ...在这种情况下,我不确定在哪里#define 它。我只是在头文件中定义它,现在我想它可能不是那么聪明。第一个错误是“error C2065: 'Console' : undeclared identifier”以上是关于动态链接库在编译时不生成 .lib 文件(Visual Studio C++ Express)的主要内容,如果未能解决你的问题,请参考以下文章