締切済み

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

  • 困ってます
  • 質問No.9428610
  • 閲覧数286
  • ありがとう数6
  • 気になる数1
  • 回答数5
  • コメント数0

お礼率 75% (78/103)

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

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で宣言してたらソースファイルではしなくてオッケーみたいな感じだったんですかね?

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

回答 (全5件)

  • 回答No.5

ベストアンサー率 28% (1304/4533)

コンピューター カテゴリマスター
>これはもうeclipseでの単体テスト諦めるしかないですかね…

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

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

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

お礼率 75% (78/103)

ありがとうございます。
ご提案いただき嬉しいです。3は今回の改修部分以外に手を入れることになってしまうと思うので難しそうです。
AIX上ではコンパイルできるので、さいあくそっちでテストする感じかなと思います。
>AIX等よそのヘッダファイルだけを持ってきて使う事はふつうにしません
冷静に考えればそうですよね。ベテランの人の言葉を鵜呑みにしてしまったのが間違ってたみたいです。
長々とお付き合いいただきありがとうございます。
投稿日時 - 2018-02-15 10:41:52
Be MORE 7・12 OK-チップでイイコトはじまる
  • 回答No.4

ベストアンサー率 28% (1304/4533)

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

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

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

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

お礼率 75% (78/103)

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

ベストアンサー率 28% (1304/4533)

コンピューター カテゴリマスター
>エラーを見ていると大した数はないのでほんとにただのダミーのスタブなら用意可能みたいです。

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

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

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

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

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

お礼率 75% (78/103)

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

開発環境ですが、全然見当違いのことをいっていたらすみません。
私のPCはwindowsでeclipseにcygwinを入れて?やってます。
cygwinのincludeファイルだとエラーが出てしまうと言うことで、AIXからincludeファイルのディレクトリごとローカルに落として、makefileのINCDIR?にそれを指定しています。
投稿日時 - 2018-02-14 01:36:49
  • 回答No.2

ベストアンサー率 28% (1304/4533)

コンピューター カテゴリマスター
>スタブで代用することはできますか?

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

お礼率 75% (78/103)

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

ベストアンサー率 43% (7474/17171)

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

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

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

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

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

違います。

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

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

お礼率 75% (78/103)

ありがとうございます。
なるほど!元々はlibbsdというライブラリを使ってコンパイルしていたから成功していたんですね。
今のローカル環境にはそのライブラリが用意できない状況なので、そのせいだったのですね。
スタブで代用することはできますか?
投稿日時 - 2018-02-13 12:49:04
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する

特集


より良い社会へ。感謝経済プロジェクト始動

ピックアップ

ページ先頭へ