🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Visual C++

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

4回答

3575閲覧

visual c++ ビルド時にLINK2005エラーが出る。

qtn.01

総合スコア33

Visual C++

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1グッド

0クリップ

投稿2019/11/26 07:38

イメージ説明

複数のc++ファイルをvisual studio 2019でビルドするとリンクエラーLINK2005が表示
されますが、初心者のためエラーの回避ができません。一体何がいけないのでしょうか?
また、具体的回避策を教えていただければありがたいです。
プログラム内ではvoid cdel_***などは使用しておりません。
どうぞ、よろしくおねがいします。

退会済みユーザー👍を押しています

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

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

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

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

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

guest

回答4

0

同じ名前の関数を2箇所で定義していませんか?C言語の処理ではコンパイルはファイル単位で行って、最後にリンクするのですが、定義が衝突するとリンク時にエラーとなります。

_cdeclはデフォルトで入るものなので、無視して読んでください。mainexpressionといった関数が複数のソースファイルで定義されているようです。

投稿2019/11/26 07:45

maisumakun

総合スコア145971

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

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

qtn.01

2019/11/26 12:18

回答ありがとうございます。そーですねー、ありそうです。その場合どのように定義すればいいのでしょうか?また、うまく回避するにはどうするればいいのでしょうか?よろしくお願いします。
guest

0

せっかく添付されているのだからreadme読むことです。

複数のmain関数が定義されてる事から、1つのプロジェクト内に複数のexeを作るためのソースが混在している事がわかります。

それらをプロジェクトから外してください。

具体的な作業としては、

Visual C++を使う場合の入力コマンド例

に出現しないファイルは不要です。

投稿2019/11/28 02:22

asm

総合スコア15149

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

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

qtn.01

2019/11/29 03:24

ありがとうございます。 Visual C++を使う場合の入力コマンド例というのは、ファイル内で呼び出しのない関数等でしょうか?
asm

2019/11/29 05:00

readme.txtに書いてあるものです。
qtn.01

2019/11/29 07:09

アドバイスありがとうございます。
guest

0

CじゃなくてC++なら話はかんたんで、ヘッダーファイルに関数を定義するときはinlineをつけましょう。以上です。

Cだと歴史的経緯も絡んで複雑で解説したくありません。


readmeにファイルの説明があるんですが読みましたかね・・・?

main関数を含むものの説明だけ抜き出しておきましょう

bbi.cpp メイン処理
token_p.cpp 字句解析プログラム(本書掲載)
polish_p.cpp 逆ポーランド記法プログラム(本書掲載)
minicalc.cpp 電卓プログラム(本書掲載)

これら全部を含めてコンパイルしたのではありませんか?bbi.cpp以外のmain関数を含むファイルはそれぞれ独立したものです。

投稿2019/11/26 13:56

編集2019/11/28 03:53
yumetodo

総合スコア5852

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

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

qtn.01

2019/11/27 05:51

ありがとうございます。構造体とかはどうすればいいのでしょうか?
yumetodo

2019/11/27 06:08

構造体宣言は複数翻訳単位に同一名の物があっても何も問題ありません。
yumetodo

2019/11/27 06:10

すべての変数定義をヘッダーファイルで行いたい場合はC++17のinline変数を使う必要があります。C++17を使えない古い環境では仕方なく値を返すinline関数を定義します。
qtn.01

2019/11/27 06:23

enum SymKind { noId, varId, fncId, paraId }; enum DtType { NON_T, DBL_T }; このようなものは使っています。
yumetodo

2019/11/27 09:55

なんにせよ宣言はいくらあっても問題ないんです、定義が複数になるときはinlineが必要になったりするわけです。
qtn.01

2019/11/28 01:28

ありがとうございます。 各cppファイルから#includeでヘッダーをインクルードしていますが、 #define SHORT_SIZ sizeof(short int) #define SHORT_P(p) (short int *)(p) #define UCHAR_P(p) (unsigned char *)(p) #define LIN_SIZ 255 このようなdefine文にはinlineをつけるということでしょうか? よろしくおねがいします。
maisumakun

2019/11/28 01:40

> define文にはinlineをつけるということでしょうか? 無関係ですし、つけると逆におかしくなります。
asm

2019/11/28 02:13

「inlineつけろ」では、main関数が重複してるので普通に考えて対処できないですね
yumetodo

2019/11/28 03:46

うわ、ホントだ、mainが衝突してる。何をどうしたらそうなるんだ・・・。ビルド方法まちがってるんじゃね、epistemeさんの指摘の通り。 あと#defineとかとにかく#で始まるたぐいのものはプリプロセッサが解釈するもので、C++コンパイラには関係のない部分です。
qtn.01

2019/11/29 07:11

ありがとうございますー。
kendji

2019/12/02 23:51

何でもかんでもinlineにするとバイナリーが肥大しますよ?
yumetodo

2019/12/03 05:56

はい?inlineキーワードとinline展開されるかに関連はありませんが?
guest

0

ベストアンサー

エスパー回答だけど、関数を定義したヘッダを複数の~.cppで #include してないかしら。

投稿2019/11/26 11:34

episteme

総合スコア16612

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

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

qtn.01

2019/11/26 12:19

ありがとうございます。ちょっと調べてみます。どれか一つのファイルで#includeすればいいのでしょうか?よろしくお願いいたします。
episteme

2019/11/26 18:09

違うそうじゃない。 ヘッダに関数を"定義"してはいけない。
qtn.01

2019/11/27 05:50

ありがとうございます。んーどうすればいいのでしょうか?
qtn.01

2019/11/27 05:59

#include "bbi.h" #include "bbi_prot.h" などが、複数のファイルから#includeしています。 どのように対処すればいいのでしょうか?よろしくおねがいします。
maisumakun

2019/11/27 06:11

ヘッダファイルに関数定義を書いていませんか? ヘッダファイルにはプロトタイプ宣言だけ書いて、関数の本体はどこかのソースコードに置いてください。
qtn.01

2019/11/27 06:19

Token (TknKind k, const string& s, double d) { kind=k; text=s; dblVal=d; }こういうのはあります。
maisumakun

2019/11/27 06:25

エラーメッセージで指摘された、expressionやfactorはどのようになっていますでしょうか。
qtn.01

2019/11/27 06:58

double get_expression(int kind1=0, int kind2=0); void expression(int kind1, int kind2); void expression(); void term(int n); ヘッダーファイルの中にこんな感じで記述してます。
maisumakun

2019/11/27 07:00

間違えて、定義を書いた.cファイルを#includeしてしまった、なんてことはないでしょうか。
qtn.01

2019/11/27 07:17

ccpファイルから#includeされているヘッダーファイルの中に、 void syntaxChk(); void set_startPc(int n); void execute(); void statement(); void block(); double get_expression(int kind1=0, int kind2=0); void expression(int kind1, int kind2); があったり、 enum SymKind { noId, varId, fncId, paraId }; enum DtType { NON_T, DBL_T }; なんてものがあります。 よろしくお願いします。
maisumakun

2019/11/27 07:25 編集

型や関数プロトタイプの「宣言」は複数ファイルに同じものが存在しても問題ありません(むしろ存在しないとコンパイルできません)。 関数の「定義」のほうはどうなっていますでしょうか。
qtn.01

2019/11/27 07:31

つまり、includeされているヘッダーに関数があるかとうことでしょうか?
maisumakun

2019/11/27 07:44 編集

そのパターン以外にも、「本当に同じシグネチャの関数定義を複数のファイルに書いていた」などもありえます。
qtn.01

2019/11/27 09:33

ありがとうございます。 もう少し具体的に言いますとどのようなものなのでしょうか?
qtn.01

2019/11/27 09:35

いままでの、経過からどこをどのように直したほうがよろしいのでしょうか? すみません、あまり経験がなものでよろしくおねがいします。
maisumakun

2019/11/27 09:44

> もう少し具体的に言いますとどのようなものなのでしょうか? 「void expression(){ /* 中略 */ }」のようなコードが複数のソースコードに書かれている。ということです。 ファイル内でしか使わない関数にはstaticをつけて、リンクのじゃまにならないようにしておきましょう。
qtn.01

2019/11/28 01:23

ありがとうございます。 各cppファイルからヘッダーをインクルードしています。ヘッダーのなかには string dbl_to_s(double d); string err_msg(const string& a, const string& b); void err_exit(Tobj a="\1", Tobj b="\1", Tobj c="\1", Tobj d="\1"); void prt(Tobj a="\1", Tobj b="\1", Tobj c="\1", Tobj d="\1", Tobj e="\1", Tobj f="\1", Tobj g="\1", Tobj h="\1"); などが記載されています。 ということは、ヘッダーファイルのなかにある、この部分をstatic宣言にすればいいのでしょうか?
maisumakun

2019/11/28 01:24

> ヘッダーのなかには(中略)などが記載されています。 これらはすべて「宣言」ですので、無関係です。
maisumakun

2019/11/28 01:25

> どこをどのように直したほうがよろしいのでしょうか? 元のコードの全貌がわからないので、なんとも言えないです。全ソースコードを提示するか、自分で探すかの2択です。
maisumakun

2019/11/28 01:29

(そして、エラーには関数名が出ているのに、その関数についての「定義」が全く提示されないのはなぜでしょうか)
qtn.01

2019/11/28 01:30

ソースコードは出せるのですが、どのように出せばいいのでしょうか? 複数あります。
episteme

2019/11/28 01:32

質問は編集できます。追加してください。
maisumakun

2019/11/28 01:39

ソースコードを全部まとめてコンパイルしていませんか? bbi_*.cppとそれ以外のコードは全く別物なので、全部一緒くたでコンパイルすると干渉して動きません。
qtn.01

2019/11/28 01:47

ありがとうございます。 どう、対処したらデバッグまで行けますか? よろしくおねがいします。
maisumakun

2019/11/28 01:49 編集

本のほうに使い方など書かれていませんか? (正直、今のzo3zo3さんのレベルで取り組むには複雑すぎるかと思います)
episteme

2019/11/28 02:45

そのコード・セットにビルド用のバッチが入ってんじゃん。 バッチ(bbimake.bat)実行したら(いくつかwarning出るものの)一発でできたぞ。
qtn.01

2019/11/29 03:22

ありがとうございます。 visual studioでビルドをするとwaringはでます。2019です。
qtn.01

2019/11/29 03:27

ちなみにDeveloper Commandのほうではできます。 そのあと、できたexe等でデバッグのやり方がよくわかりません。
maisumakun

2019/11/29 03:54

必要なソースコードだけでプロジェクトを作成する、というのが適当かと思います。
qtn.01

2019/11/29 07:10

ありがとうございます。 必要なものだけで、ビルドしましたらできました! みなさんの長いお付き合い本当に感謝です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問