web-dev-qa-db-ja.com

ダイナミックリンクライブラリは、コンパイル時に.libファイルを生成しません(Visual Studio C ++ Express)

C++の学習の一環として、単純なクラスライブラリとそれを参照するアプリケーションを作成しました。クラスライブラリを除くすべてがビルドされ、.libファイルが生成されないため、アプリケーションは「LINK:致命的なエラーLNK1104:ファイルを開けません」をスローします。これは非常に合理的です。明らかに、必要なファイルがない場合はエラーが発生し、致命的です。 (サイドノート:私はまだ本を持っていません)

そこで、.libファイルが生成されない理由を探しに行きました。ちなみに、私の検索フーはかなり弱いです。私が見つけたのは、ライブラリに__declspec(dllexport)タグがなければ、.libをエクスポートしないということだけでした。

ここで、クラスライブラリのヘッダーと.cppコンテンツ(1つの「Write(std :: string)」メソッドを持つ単純な「Console」クラス)を投稿します。

ヘッダ:

// 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();
    }
}

確認しましたが、ダイナミックリンクライブラリを生成するように設定されています。

ありがとう。

33
Narf the Mouse

クラスを正しくエクスポートする方法を示すサンプルコードを次に示します。 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:C++クラスをDLLからエクスポートする

25
Nathanael