动态链接库在编译时不生成 .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)的主要内容,如果未能解决你的问题,请参考以下文章

为啥我用VC6编译动态链接库不生成lib和exp文件

Visual Studio中怎么生成动态链接库的lib文件

Makefile 链接静态库

Linux学习——动态链接库和静态链接库

Visual Studio 2017 动态链接库(DLL /LIB) 静态链接库(LIB)的思考

.h头文件 .lib库文件 .dll动态链接库文件关系