[解決済み] LNK2019: unresolved external symbol - function というエラーはどうすれば解決できますか?
質問
このエラーが発生するのですが、どうしたらいいのかわかりません。
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
は、必要に応じてビルドプロパティを変更しない限り、スタンドアロン実行可能なプログラムにはなりませんが、これはあまり理想的ではありません。
関連
-
[解決済み] テスト
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】coutはstdのメンバではない
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない