質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

Q&A

解決済

2回答

14195閲覧

Visual C++でのライブラリファイルを参照する方法について

TOMO6181

総合スコア39

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

0グッド

0クリップ

投稿2018/09/23 14:55

編集2018/09/24 12:01

Visual C++でのライブラリファイルを参照する方法について質問です。

使用しているのはVisual Studio 2013です。
以下のコードをライブラリとして作成しています。

MyDLL.cpp

C++

1#include "stdafx.h" 2#include "mydll.h" 3 4// 加算 5int add(int a, int b) { 6 return a + b; 7} 8 9// 減算 10int sub(int a, int b) { 11 return a - b; 12} 13 14// 乗算 15int multi(int a, int b) { 16 return a * b; 17} 18 19// 除算 20int divi(int a, int b) { 21 if (b == 0){ 22 return 0; 23 } 24 else{ 25 return a / b; 26 } 27}

mydll.h

C++

1extern "C" { 2 __declspec(dllexport) int add(int a, int b); 3 __declspec(dllexport) int* arr_a(int length); 4 __declspec(dllexport) void arr_b(int* arr, int length); 5}

上記のコードをコンパイルすることで、ライブラリファイルMyDLL.dll、MyDLL.lib
を作成します。

それに対して、参照先プロジェクトを以下のように設定します。

1 Visul studioで新規プロジェクトとして、「Win32コンソールアプリケーション」を追加。
2 ソリューションファイルと同じフォルダに、「lib」フォルダを追加。

イメージ説明

3 libフォルダの下に、MyDLL.dll、MyDLL.libファイルをコピー。
イメージ説明

4 ソリューションエクスプローラからプロジェクト名を右クリックし、プロパティを選択。

5 リンカ―→全般で、追加のライブラリディレクトリで「$(SolutionDir)lib」を設定。
イメージ説明

6 参照元のDLLファイル「MyDLL.dll」を、参照先のReleaseフォルダ元にコピー。
イメージ説明

7 参照先のプロジェクトで、以下のコードを作成。

UserCPlusDLL.cpp

C++

1#include "stdafx.h" 2#include "iostream" 3 4#pragma comment(lib, "MyDLL.lib") 5 6using namespace std; 7 8int _tmain(int argc, _TCHAR* argv[]) 9{ 10 int ans1; 11 int ans2; 12 int ans3; 13 int ans4; 14 15 ans1 = add(1, 2); 16 ans2 = sub(2, 1); 17 ans3 = multi(2, 2); 18 ans4 = divi(4, 2); 19 20 cout << "ans1=" << ans1 << "ans2=" << ans2 << "ans3=" << ans3 << "ans4=" << ans4 << endl; 21 22 return 0; 23}

上記のようにして参照先のプロジェクトでビルドを行うと、
IntelliSense: 識別子 "add" が定義されていません
error C3861: 'add': 識別子が見つかりませんでした
の類のエラーが発生します。
他の関数呼び出しに関しても同様です。

どうやら、ライブラリの参照が上手くいっていないようです。
どこか手順で誤っている個所、足りない箇所が分かる方がおられましたら、宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

"mydll.h" がインクルードされていないことは、すでに指摘され
ているとおりですが、"mydll.h" の中身もおかしいです。

MyDLL.cpp に

cpp

1int add(int a, int b) 2int sub(int a, int b) 3int multi(int a, int b) 4int divi(int a, int b)

が定義されているのに対し、

mydll.h は

h

1int add(int a, int b); 2int* arr_a(int length); 3void arr_b(int* arr, int length);

です。

mydll.h を見直した方がいいですね。

C/C++ はライブラリはリンク時に参照します。
コンパイル時にはヘッダーをインクルードして参照します。

投稿2018/09/24 01:21

Bull

総合スコア986

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TOMO6181

2018/09/24 03:41 編集

ありがとうございます。 仰る通り、ヘッダーファイルの定義漏れとmydll.hの間違いが原因でした。 mydll.hを修正し、参照先のプロジェクトから以下のヘッダーファイルをincludeしたところ、 コンパイル、及び実行することができました。 ・mydll.h extern "C" { int add(int a, int b); int sub(int a, int b); int multi(int a, int b); int divi(int a, int b); }
guest

0

C++

1#include "mydll.h"

投稿2018/09/23 15:03

y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問