1. ホーム
  2. c++

[解決済み] LNK2019: unresolved external symbol - function というエラーはどうすれば解決できますか?

2022-01-31 11:34:24

質問

このエラーが発生するのですが、どうしたらいいのかわかりません。

Visual Studio 2013を使用しています。ソリューション名を MyProjectTest これは、私のテストソリューションの構造です。

- 関数.h

#ifndef MY_FUNCTION_H
#define MY_FUNCTION_H

int multiple(int x, int y);
#endif

-function.cpp

#include "function.h"

int multiple(int x, int y){
    return x*y;
}

- main.cpp

#include <iostream>
#include <cstdlib>
#include "function.h"

using namespace std;

int main(){
    int a, b;
    cin >> a >> b;
    cout << multiple(a, b) << endl;

    system("pause");
    return 0;
}

初心者です。簡単なプログラムですが、エラーもなく動いています。 インターネットで読んで、ユニットテストに興味を持ったので、テストプロジェクトを作りました。

メニュー ファイル 新規 プロジェクト... インストール済み テンプレート ビジュアル C++ テスト ネイティブユニットテストプロジェクト

名称 UnitTest1
解決策 ソリューションに追加

すると、場所が現在開いているソリューションのパスに自動的に切り替わりました。

これがソリューションのフォルダ構造です。

ファイルのみ編集しました。 unittest1.cpp :

#include "stdafx.h"
#include "CppUnitTest.h"
#include "../MyProjectTest/function.h"

using namespace Microsoft::VisualStudio::CppUnitTestFramework;

namespace UnitTest1
{
    TEST_CLASS(UnitTest1)
    {
    public:

        TEST_METHOD(TestEqual)
        {
            Assert::AreEqual(multiple(2, 3), 6);
            // TODO: Your test code here
        }

    };
}

しかし、私は得る。

error LNK2019: 未解決の外部シンボルです。

を実装していることは知っていますが、関数 複数 が抜けています。 を削除しようとしたのですが 関数.cpp ファイルを作成し、宣言を定義に置き換えたら、実行されました。しかし、同じファイルに宣言と定義の両方を書くことは推奨されません。

そんなことをしなくても、このエラーを解決するにはどうしたらいいのでしょうか?次のように置き換えたらどうでしょうか? #include "../MyProjectTest/function.cpp" を作成しましたか?

解決方法は?

一つの方法として function.cpp の中に UnitTest1 というプロジェクトがありますが、これは最も理想的なソリューション構造とは言えないかもしれません。 この問題に対する簡潔な回答は、プロジェクトで UnitTest1 プロジェクトでは、コンパイラとリンカは function.cpp の定義が含まれるリンクは何もありません。 multiple . これを解決する方法として、リンクライブラリーを利用する方法があります。

ユニットテストは別のプロジェクトにあるので、そのプロジェクトをスタンドアローンのユニットテスト・プログラムにする意図があると思われます。 テストする関数が別のプロジェクトにある場合、そのプロジェクトを動的または静的にリンクされたライブラリにビルドすることが可能です。 静的ライブラリは、ビルド時に他のプログラムにリンクされ、拡張子は .lib ダイナミックライブラリは実行時にリンクされ、拡張子は .dll . 私の答えとしては、静的ライブラリの方がいいと思います。

プロジェクトのプロパティで変更することで、最初のプログラムをスタティック・ライブラリにすることができます。 Generalタブの下に、プロジェクトが実行ファイルにビルドされるように設定されているオプションがあるはずです( .exe ). これを .lib . また .lib と同じ場所にビルドされます。 .exe .

あなたの UnitTest1 プロジェクトのプロパティを開き、[リンカー] タブの [追加のライブラリ・ディレクトリ] カテゴリの下にある MyProjectTest をビルドします。 次に、「リンカー - 入力」タブの「追加の依存関係」に、静的ライブラリの名前を追加します。 MyProjectTest.lib .

これでプロジェクトがビルドできるようになるはずです。 なお、こうすることで MyProjectTest は、必要に応じてビルドプロパティを変更しない限り、スタンドアロン実行可能なプログラムにはなりませんが、これはあまり理想的ではありません。