老親介護に悩む30~60代の方へ
老親介護ねっと[老人ホーム編]
トップ 老人ホームの選び方 介護関連ニュース 新規オープンホーム情報 老人ホーム取材レポート お問い合わせ リンク集 Q&A

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

定義されているのにエラーになる

閲覧ありがとうございます。

C言語のプログラムの話です。

ソースファイルaaa.cでstdio.hをincludeしています。
stdio.hには
extern FILE _iob[_NIOBRW];
というのが定義されているにも関わらず、
コンパイルすると、
aaa.o:aaa.c:(.data+0x58): undefined reference to '_iob'
というエラーが出ます。
aaa.cでは_iobに関する宣言はしていませんが、それを使うこともしていません。

ヘッダファイルでexternで宣言してるからかなと思い、ソースファイルにexternなしの宣言を書き足したら、コンパイルは通りました。

今回は元々既にあるプロジェクトの改修だったのですが、宣言を消したりしていません。
しかし、その部分は元々ヘッダファイルに宣言などしなくてもコンパイルが通ってました。

昔はヘッダファイルでexternで宣言してたらソースファイルではしなくてオッケーみたいな感じだったんですかね?

私自身、あまりよく分かってなくて文章もめちゃくちゃですみません。
不足している情報があればできる範囲でお伝えしますので、ご協力よろしくお願いいたします。

投稿日時 - 2018-02-13 11:33:46

QNo.9428610

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

>これはもうeclipseでの単体テスト諦めるしかないですかね…

単体テスト以前に開発そのものが怪しいんですけど・・・

とれる手段としては
1. 諦める
2. AIXのヘッダファイルに対応したcygwin用Cライブラリを作成する。
3. AIXのヘッダファイルとライブラリとcygwinのヘッダファイルとライブラリの差を吸収できるような作りに直す。
私なら3でしますけどベテランと思われる方が、それだと難しいかなぁ。

とりあえずcygwinのライブラリはcygwinのヘッダファイルに対応した作りになっていますから(そのヘッダファイルを使ってライブラリは作られているんですから)、AIX等よそのヘッダファイルだけを持ってきて使う事はふつうにしません(cygwinとは書いていますがcygwin固有の話ではないです)。

投稿日時 - 2018-02-14 20:14:29

お礼

ありがとうございます。
ご提案いただき嬉しいです。3は今回の改修部分以外に手を入れることになってしまうと思うので難しそうです。
AIX上ではコンパイルできるので、さいあくそっちでテストする感じかなと思います。
>AIX等よそのヘッダファイルだけを持ってきて使う事はふつうにしません
冷静に考えればそうですよね。ベテランの人の言葉を鵜呑みにしてしまったのが間違ってたみたいです。
長々とお付き合いいただきありがとうございます。

投稿日時 - 2018-02-15 10:41:52

ANo.4

>なんだかC言語でウン十年のベテランみたいな人がそれでできると言ってたのでてっきり…。stdio.hのライブラリのスタブを作らなくてはいけないとは思わなかったのかもしれませんね。これは困ったことになりました…

ベテランさんは、あなたがAIXの標準Cライブラリのインクルードファイルをローカルに持ってきて作業するとは思わなかったんだと思いますが・・・
AIXの開発環境のライセンスも関わってきますし。

>cygwinのincludeファイルだとエラーが出てしまうと言うことで、AIXからincludeファイルのディレクトリごとローカルに落として、makefileのINCDIR?にそれを指定しています。

インクルードファイルだけAIXからcygwinの環境に持ってきても意味がありませんし、かといってライブラリを持ってきてもcygwinでは動きません。
やるなら、cygwin環境ではcygwinのインクルードファイルを使ってエラーが出ないようにし、AIXでも問題ないようにするのが正解です。

投稿日時 - 2018-02-14 03:54:08

補足

ありがとうございます。そうなんですね…。
>ベテランさんは、あなたがAIXの標準Cライブラリのインクルードファイルをローカルに持ってきて作業するとは思わなかったんだと思いますが・・・
実は、AIXからincludeファイルを持ってくるといいと言うように言ったのは、そのベテランさんなのです…。
それでもう、そのような環境に皆してしまっていて…そこから間違ってたんですか…。
これはもうeclipseでの単体テスト諦めるしかないですかね…

投稿日時 - 2018-02-14 07:09:16

ANo.3

>エラーを見ていると大した数はないのでほんとにただのダミーのスタブなら用意可能みたいです。

stdio.hなど標準Cライブラリのスタブの場合は、ある程度作り込まないと色々大変ですよ。
>extern FILE _iob[_NIOBRW];
などは、printf()なども関わってきますから単にダミーを作っただけでは、
それら関数は動かないことになります。

>クロス開発かは分かりませんが、

WindowsでAIXのシステムを開発したり、
逆にAIXでWindowsのシステムを開発したり
実行環境と異なるプラットホームで開発する事です。

>AIX上で使ってるシステムをeclipse上で操作しようとしてます。

そのeclipseがAIX上で動かしているのなら質問にあるような問題は出てこないと思うのですが、
もしかしてAIX以外の環境にAIXのstdio.hなどのインクルードファイル持ってきてやられてますか?

投稿日時 - 2018-02-13 22:13:38

補足

ありがとうございます!
>単にダミーを作っただけでは、それら関数は動かないことになります。
そうなんですね…なんだかC言語でウン十年のベテランみたいな人がそれでできると言ってたのでてっきり…。stdio.hのライブラリのスタブを作らなくてはいけないとは思わなかったのかもしれませんね。これは困ったことになりました…

開発環境ですが、全然見当違いのことをいっていたらすみません。
私のPCはwindowsでeclipseにcygwinを入れて?やってます。
cygwinのincludeファイルだとエラーが出てしまうと言うことで、AIXからincludeファイルのディレクトリごとローカルに落として、makefileのINCDIR?にそれを指定しています。

投稿日時 - 2018-02-14 01:36:49

ANo.2

>スタブで代用することはできますか?

できはしますけど標準Cライブラリ(の使用している関数分)のスタブを用意するのは大変ですよ?
それと標準Cライブラリの関数が実装されたライブラリが使用できないというのはクロス開発でもされているのでしょうか?

投稿日時 - 2018-02-13 19:23:13

補足

ありがとうございます。
エラーを見ていると大した数はないのでほんとにただのダミーのスタブなら用意可能みたいです。
勉強不足で申し訳ないのですが、クロス開発かは分かりませんが、AIX上で使ってるシステムをeclipse上で操作しようとしてます。
ライブラリという言葉も何度調べても頭に入ってこなくて意味の分からないことを言ってるかもしれません。
申し訳ないです…。

投稿日時 - 2018-02-13 20:17:43

ANo.1

_iobの実体は「標準Cライブラリ」の中にあります。

リンク時に「標準Cライブラリ」も一緒にリンクしてあげないと「実体が見付からない」というエラーになります。

>ヘッダファイルでexternで宣言してるからかなと思い、ソースファイルにexternなしの宣言を書き足したら、コンパイルは通りました。

それは「やってはいけない事」です。

>昔はヘッダファイルでexternで宣言してたらソースファイルではしなくてオッケーみたいな感じだったんですかね?

違います。

「実体がライブラリオブジェクトの中にあるから、宣言はexternで『どこにあるか知らないが、ココでは無いどこかにある』と宣言する」のです。

stdio.hをインクルードするなど「Cライブラリを利用する宣言」をした場合は、リンク時にコンパイラに「このライブラリも一緒にインクして下さい」と指定して「標準Cライブラリの実体(本体)」も一緒にリンクしないといけません。

投稿日時 - 2018-02-13 12:10:39

補足

ありがとうございます。
なるほど!元々はlibbsdというライブラリを使ってコンパイルしていたから成功していたんですね。
今のローカル環境にはそのライブラリが用意できない状況なので、そのせいだったのですね。
スタブで代用することはできますか?

投稿日時 - 2018-02-13 12:49:04