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

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

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

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

Q&A

解決済

6回答

3038閲覧

MinGW-w64 C++での undefined reference to ---エラー

bldtemporal

総合スコア35

C++

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

0グッド

0クリップ

投稿2021/12/13 02:35

・申し訳ありません、過去質問したのですが、要点を得ない書き方になってしまっていました。現在の問題点に限っての再質問をお許し下さるようお願い致します。

・MinGW-w32及びw64のC言語では問題なくコンパイルと計算実行できているプログラムですが、C++コンパイルしようとすると、下記のエラーが表示されます。
「undefined reference to subroutine A(double*, double*, double, int, ---)」
色々試したのですが、解消されません。referenceを成功させるためのお知恵がありましたらお教え下さい。

・試したこと
(1)ネットを調べましたら、makefileのLDFRAGSに、(lib)-liconvを追加する。とありましたので実施しましたが、改善しませんでした。
(2)該当のサブルーチンAを"//"、または削除としてみたところ、エラーは無くなり、計算実行も可能となりました。しかしながら、当然、正しい結果は出てきません。、

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

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

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

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

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

int32_t

2021/12/13 02:40

その subroutine A() を実装してはずのオブジェクトファイルをリンクしていますか? リンクしているなら、ソースのファイル名はなんでしたか?
SaitoAtsushi

2021/12/13 03:38

削除してみたというのは宣言ですか、定義ですか? ソースとヘッダはどのような構成になっていますか?
bldtemporal

2021/12/13 06:24

int32_t様:ご意見有難うございます。質問の意味が分かりかねますが、ともかく、最初にサブルーチンのプロトタイプ宣言、mainで呼び出し、サブルーチン本文、の記載順序です。 SaitoAtsushi様:有難うございます。削除は2方法で実施しました。 (1) プロトタイプ宣言、main呼び出し、サブルーチン本文、の全て削除 (2) main中の呼び出し部のみ削除、 両方式とも結果に変わりはないため、現在は(2)に基づいて、"//"(コメント文化)で進めております。
int32_t

2021/12/13 06:26

完全なエラーやコードやMakefileを開示してないので、憶測しか言えない状態になってますね。
int32_t

2021/12/13 06:27

> 最初にサブルーチンのプロトタイプ宣言、mainで呼び出し、サブルーチン本文 関係するソースコードは1つしかないということですね?
SaitoAtsushi

2021/12/13 07:20

独自の用語は避けてください。 サブルーチンと呼んでいるものは (C/C++ 用語でいうところの) 関数のことですね? それと他の方も指摘していますが情報が小出しすぎます。 必要な情報が何なのか見極められるならこんなところで質問しなくても解決できています。 質問者には意味のある抽出は出来ないので情報を取捨選択しないでください。 あまりに巨大なソースコードだとさすがに困りますが、問題を再現できる程度の情報が示されればそんなに難しい質問ではないはずなのに細かな質問を繰り返さなければならないのは回答者にとって若干のいらだちを感じるということをわかってください。
bldtemporal

2021/12/13 07:53

SaitoAtsushi 様、度々ご回答を頂き申し訳ありません。Fortranでの命名はサブルーチン、"C”でもサブルーチン(の関数)と記載されております。サブルーチン数も36あります、かなり大きなプログラムです。全部の掲示は無理です。情報は小出しのつもりはありません。エラー指摘されているように、サブルーチン名(型名+引数、----)、それに、ヘッダーファイルがあれば十分と考えました。ヘッダーファイル名もエラーメッセージに並べて掲示するべきだったと思っています。ヘッダーファイルは#include <cstdio>,#include<cstdlib>,#include <math.h>,#include <time.h> です。何か不足していますでしょうか、
bldtemporal

2021/12/13 08:08

int32_t 様、度々のご意見有難うございます。 ・完全なエラーメッセージは、どこかに述べましたが、a.cpp:(.text+0xb8f4): undefined reference to sub_A(引数)collect2.exe error ld returned exit status です。makefileはMinGW-w64から見ることができます。またソースコードは一つだけです。
int32_t

2021/12/13 08:16

> ソースコードは一つだけです。 この情報でかなり原因は絞られたと思います。 ともかくプロトタイプ宣言と関数定義のシグネチャ部を開示してください。
thkana

2021/12/13 13:22

> 情報は小出しのつもりはありません。 情報量としては、回答者があなたの行った作業を完全に再現して、エラーを確認できることが理想です。 それができないとすれば、情報が足りていないということです。足りない部分が、質問者と回答者とで互いに共通している「常識」で補えるのならよいのですが、質問者が一方的に「これは要らない」「これは無駄だ」「これは変えてもいい」と思うだけで情報を削除・改変していたら、それは単なる情報不足(あるいは誤った情報)です。 あなたの「つもり」はともかく、複数の回答者が情報が足りない、と思っているから「追記・修正」の欄の投稿数が伸びるのではないでしょうか?
yominet

2021/12/13 13:46

>下記のエラーが表示されます。 >「undefined reference to subroutine A(double*, double*, double, int, ---)」 この「」の中身はどこに表示されたのでしょうか? 表示された画像をSnippingツールや、スクリーンショットをとって貼ってみてはいかがでしょうか?
bldtemporal

2021/12/14 04:13

yominet様、ご関心有難うございます、エラー表示は画面の最初です。
guest

回答6

0

自己解決

回答投稿者の皆さま、有難うございました。
やはり、サブルーチンの記載の仕方に問題があったようです。エラー表示が画面の最初に30行(画面おの大きさによっては画面いっぱいになる)以上出てきました。"C"では画面の最初に出る10行程度出るときは完全な非容認ですので、致命的エラーと感じてしまいました。”C”ではサブルーチン引数エラーの場合、lesargumentに関してless,too much, conflicting, incompatibleなどと表記されますので、それとはまったく違うエラーと思い込んでしまって違う方向の対策に進んでしまいました。C++化の後何度もチェックしたのですが、違うとところでエラー(例えばgotoの可否など)が出る度、いりいろ修正していましたので、その時にエラー箇所もいじってしまったようです。具体的には引数の順番に食い違いがあったということです。皆様を混乱させましたことをお詫び致します。

投稿2021/12/14 04:39

bldtemporal

総合スコア35

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

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

int32_t

2021/12/14 04:44

undefined reference to 以外にも警告がたくさん出ていたということですか?
thkana

2021/12/14 04:51

> 具体的には引数の順番に食い違いがあったということです それは具体的な説明とは全く思いませんが、 つまり私の回答で指摘した通りの問題があった、という理解でよろしいでしょうか?
bldtemporal

2021/12/14 06:22

int32_t 様、ご関心有難うございます。 警告はかなりありました。重なるところもありますが100行くらいでしょうか、配列でnot declaredとかです。undefine reference toの前に迷った問題はgotoでした。Fortranから出発しているので、goto山盛りです。ただ単に不要部を飛ばすということでもエラーになりました。”初期化の前にgotoを使ってはいけない”とかの記述をどこかで見ましたが、それだったかも知れません。どうしても通らない部分は”//”で処理して、undedfined reference to にたどりついたというところでした。 thkana 様 y_waiwai様からも指摘されていました。結果としてその通りだったと言えます。月並みですが、もう少し早く念入りチェックをすべきでした。 少し言い訳を言いますが、この種のエラーに対して"C"ではエラー内容を明確にして2行程度の表示、一方"C++"では、最初にドカンと大量のメッセージが出てきます。違うエラー(周辺の記述が関係する)と思い込んでしまいました。まあこれで、このエラーに対するC++のメッセージを理解することができました。
guest

0

試しに該当のサブルーチンを、extern宣言を削除、staticで修飾、main関数の前で定義、してみたらどうでしょうか?

投稿2021/12/13 11:45

Serbonis

総合スコア581

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

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

bldtemporal

2021/12/16 08:45

Serbonis様、アドバイス有難うございます。既に全面解決していますが、ご意見に対してお答えしたく思います。➀exturn宣言は使っていません。ソースは一個なので、使う必要はないようです(使い方も良く分かりません)。②staticは、変数を固定したいときかなり使っています。繰り返し計算ですので、そうしないとゴミ化がするものもありました。③サブルーチンは30個以上ありますので、main関数の前で、プロトタイプ宣言し、mainの後にサブルーチンを記載する、という形式です。
guest

0

undefined reference to ...未定義のシンボル のエラーでは、以下のような原因が多いです。

  • リンク漏れ: 関数などを定義しているオブジェクトファイルやライブラリをリンク時に指定していない
  • extern "C" の間違い: CとC++が混在する場合、必要な extern "C" がなかったり不要な extern "C" があったりする、ぜんぶ C++ なのに extern "C" を付けている、など。
  • プロトタイプ間違い: プロトタイプ宣言があるのに関数定義がない、プロトタイプ宣言と関数定義が微妙に異なっている、など。

(現在具体的なコードがいっさい開示されていないので、一般論だけの回答です)

投稿2021/12/13 06:38

編集2021/12/13 06:41
int32_t

総合スコア20843

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

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

bldtemporal

2021/12/13 07:35

int32_t 様、度々の回答有難うございます。 ・リンク漏れ:何をしたらよいのかよく分かりませんが、ともかく、ヘッダーファイルを、#include <cstdio>,#include<cstdlib>,#include<math.h>,#include <time.h>としています。 ・ロトタイプ間違い: これについては、プロトタイプ宣言、main部の呼び出し、サブルーチン本文、を並べてみて引数部を何度もチェックしましたので、大丈夫だと思います。 ・プログラム全体の掲示:かなり大きなプログラムです(10000行弱)ので、全文掲示は困難です。また、関係ないところを掲示しても意味ないと思います。不具合部のみで十分と思っていますが、 ・extern "C" の間違い: 全部C++としてプログラミングしているつもりです。exturnは使用しておりません。
int32_t

2021/12/13 07:42

> プロトタイプ宣言、main部の呼び出し、サブルーチン本文、を並べてみて引数部を何度もチェックしましたので、大丈夫だと思います。 実際に見せてもらわないと、質問者さんの見逃しの疑いが晴れません。開示してください。 > ・プログラム全体の掲示 問題が再現できる最小のコードを作って開示するのが理想ですね。
bldtemporal

2021/12/13 08:29

int32_t 様、コメント有難うございます。確かに問題を再現できる最小コードを作ってみるべきと思います。最小化と言っても、他のいくつかのサブルーチンから計算データをポインター渡しで受けていますから、かなり複雑入り組んでしまいます。すぐ完成できませんが、どうしてもうまくする必要があるので考えてみます。
SaitoAtsushi

2021/12/13 08:40

> 不具合部のみで十分と思っていますが その不具合部の情報も十分に提示されているようには思えませんが、別の箇所での間違いや様々な要因の組み合わせの結果がある箇所でエラーとして出現することはありふれたことです。 質問者は引数に間違いがないと確信しているのなら、なおさら他の箇所の情報が必要ということではないですか。
bldtemporal

2021/12/14 06:29

saitoAtsushi様、貴重なご意見有難うございます。今回は自己解決として記述しましたが、単なるエラー指摘の部分だけの問題でした。私も別の個所の問題が組み合わさって、別のところにエラーがセル、と言いますか、計算不能になる現象は経験しています。一か所の誤りを他の個所の複数誤り出帳消しにするような現象もありました。それで今回は周辺を中心に捜索していましたが、意外にも単純な事象でした。
guest

0

C++

1extern void subroutine_A(double*); 2 3int main() 4{ 5 double d = 3.14; 6 subroutine_A(&d); 7}

このコードをコンパイルすると、次のようなエラーメッセージが表示されます。

text

1/usr/bin/ld: /tmp/cccS4yIs.o: in function `main': 2a.cpp:(.text+0x30): undefined reference to `subroutine_A(double*)' 3collect2: error: ld returned 1 exit status

質問するときに、エラーメッセージは省略せずに全部提示してください。
コピペせずに手で入力して、'_' が落ちているのではありませんか?

投稿2021/12/13 04:01

kazuma-s

総合スコア8224

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

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

bldtemporal

2021/12/13 06:16

kazuma-s様:コメント有難うございます。(.txt---) a.cppからはその通りです。一度全部記載して質問したことがあったのですが、非常に見難くなりました。ネットでの記事では、この部分のみ述べていますので、踏襲しました。 '_'はエラーメッセージに見当たりません。
kazuma-s

2021/12/13 06:23

subroutine A ではなく、subroutine_A なのではありませんか、と言っているのです。 なぜ、その関数の宣言や呼び出しの部分のコードを提示しないのですか?
bldtemporal

2021/12/13 08:19

kazuma-s 様、恐れ入ります。 sub_A(引数型のみ)です。関数の宣言、mainでの呼び出し、サブルーチン本体は、エラーメッセージにある、sub_A( )だけです。宣言と本体では、int が付きますが、呼び出しでは、そのままです。だらだらと並べても見ずらいだけと考えました。
guest

0

"undefined reference to subroutine" という言い回しをC/C++のコンパイラがするかなぁ?

とにかく。Cでは通っていたのがC++で通らないというと、Cではいい加減だったのがC++で厳密に(というか普通に?)なった型(特にポインタ)の暗黙の変換あたりに怪しさを感じます。

関数Aの宣言/定義の引数リストと、呼び出し時の引数の型が一致しているでしょうか?

投稿2021/12/13 03:46

thkana

総合スコア7629

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

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

bldtemporal

2021/12/13 05:44

thkana様:度々のアドバイス有難うございます。”subroutine”と書かれているのではありません。不具合関数名を指している、と言うことです。ネットでも記載があります。確かに、ポインター変数(引数)が沢山有ります。また、変数型宣言もかなりの量必要dスのので、その辺を疑って、かなり神経質にチェックしていますが、もう一度見直してみます。
thkana

2021/12/13 13:13

> ”subroutine”と書かれているのではありません そういう意味のない隠し事をして惑わせないでください。 > ネットでも記載があります。 なんの記載があるのですか? 具体的に示してください。 > 神経質にチェック これまでの(他の方とのも含めて)やりとりを見ていると「神経質」とはちょっと違う、自分が正しいと思ったら絶対に曲げない頑固さを感じます。 しかし、プログラミングに於いてエラーが出ているときは、「必ず」自分が間違っているのですから(ひどくまれにコンパイラなどのバグもありますが、それは前提にすべきではない)、「自分は正しいのにエラーが出ている」というつもりになってしまうとエラーが見つからなくなります。自分が必ず間違えているんだ、その間違いを探そう...という気持ちで挑んでください。
guest

0

はやいはなし、その名前の関数がどこにも見つからない、というクレームです
そいつはどこにあるんでしょうか

投稿2021/12/13 03:00

y_waiwai

総合スコア87749

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

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

bldtemporal

2021/12/13 05:37

y_waiwai様:度々のご検討、本当に有難うございます。その関数(サブルーチンを参照できない)(見つからない)ということは理解しております。サブルーチンですので、最初にプロトタイプ宣言をし(int sub_())、mainの後にサブルーチンプログラム(int sub_())を記載し、main中でsub_()で呼び出す普通の方法です。他に30個ほど、同様のサブルーチンがあるのですが問題ありません。また、くどいですがMinGW-w64でも問題なく通ております。全く分かりません
y_waiwai

2021/12/13 05:45

その関数の引数の数、型はあってるでしょうか C++ではそこらへんも全部合わないとダメです
bldtemporal

2021/12/13 06:05

y_waiwai様:申し訳ありません。”MinGW-w64でも問題なく通っている”は ”MinGW-w64の”C"で問題なく通っている”の間違いです。誤解をさせてしまったと思います。お詫び致します。
bldtemporal

2021/12/13 06:36

Y_waiwai様:ご意見有難うございます。プロトタイプ宣言、mainの呼び出し部、サブルーチン本体で、引数の型宣言や数が合わないと、”C”でも通らないです。但し、mainで3回呼び出す(変数名を少し変えて)ので、そのとき変数名が少し違っていても通ってしまうことがあります。このエラーメッセージがあって、その辺は矛盾が無いよう何度も見直しました。更にチェックしてはみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問