• ベストアンサー
  • 困ってます

GCCでの割り算の方法を教えて下さい。

SH2の組み込みシステムのソフトをGCCにて開発しています。分母が変数の下記のような割り算のプログラムを作成した所LINKエラーが出て困っています。ちなみに分母が定数の時はOKです。どなたか初心者なので易しく解説して頂けないでしょうか?よろしくお願い致します。 ~ int a,b = 10; a=30/b; ~ エラー内容 undefined reference to '__sdivsi3'

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数482
  • ありがとう数6

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.2
  • KOH_da
  • ベストアンサー率31% (161/506)

単にライブラリがないだけでしょ。 コンパイラのインストールがうまくいってないか、 環境設定がうまくいってないのだと思います。 定数の除算でエラーが出ないのは、 コンパイル時にライブラリではなく、 即値専用の割り算ルーチンに変換されるからです。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

早速の回答ありがとうございます。 ご指摘の通り、これまでSAMPLEのコンパイルバッチファイルをそのまま使っていたのですが、これに問題がありました。 コンパイルバッチファイルを調査した所、リンカオプションコマンドの中に標準ライブラリ参照が含まれていない事がわかりました。この参照を追加した所OKとなりました。初心者にはなかなか難しいです。 ありがとうございました。

関連するQ&A

  • LinuxのgccのLIBパス? (類似質問)

    Linuxのgccで、LIBのパスを設定する方法が知りたいのですが、gccについて詳しい書籍やサイトがありましたら、教えてください。 例)gcc -I/usr/local/example/include test.c /tmp/ccOFpCBo.o(.text+0x26): In function `main': : undefined reference to `EXAMPLE_1' /tmp/ccOFpCBo.o(.text+0x37): In function `main': : undefined reference to `EXAMPLE_2' /tmp/ccOFpCBo.o(.text+0x48): In function `main': : undefined reference to `EXAMPLE_3' collect2: ld はステータス1で終了しました。 また、ldとはVC6++でいう LINKのことでしょうか?

  • Windowsコモンコントロールのcygwin/gccコンパイルエラー

    以下のサイトのようなWindowsコモンコントロールのプログラムをcygwin/gccコンパイルするとエラーがでます。 (sourceのサイト) http://wisdom.sakura.ne.jp/system/winapi/common/common16.html (ビルドコマンド) gcc -mwindows -mno-cygwin -o main.exe main.cpp (エラー出力) undefined reference to `_ImageList_Destroy@4' undefined reference to `_InitCommonControls@0' undefined reference to `_ImageList_Create@20' undefined reference to `_ImageList_ReplaceIcon@12' undefined reference to `_ImageList_ReplaceIcon@12' collect2: ld returned 1 exit status make: *** [main.exe] Error 1 Windowsコモンコントロールを含んだプログラムをcygwin/gccコンパイルするにはどうすればよいでしょうか? コンパイルは出来ないのでしょうか? よろしくお願いします。

  • cygwinのgccが、エラーになってしまいます。

    テストプログラム $ cat test.c #include <stdio.h> int main (void) { printf("Hello, World!\n"); return 0; } これを、コンパイルすると $ gcc test.c gcc: error trying to exec '/usr/lib/gcc/i686-pc-cygwin/4.5.3/cc1.exe': execv: Bad address /usr/lib/gcc/i686-pc-cygwin/4.5.3/../../../libcygwin.a(libcmain.o):(.text+0xba): undefined reference to `_WinMain@16' collect2: ld はステータス 1 で終了しました と、このようなエラーが出てきました。 ファイルを確認しても、何も作られていません。 $ ls test.c 対処方法を、ご教示願います。

その他の回答 (1)

  • 回答No.1

SH2を使っていたのはかなり前で、資料も手元に残っていないんですが...。 SH2は命令長16bitの、最低限のCPU命令しか持っていません。 したがって、割り算などの(Cレベルでは)基本的な命令でも、ヘルパライブラリ関数を呼ぶような形にコンパイルするようになっています。(これはgccであればアセンブラのリスティングをすればわかると思います。) 組み込みシステムということで、提供されているライブラリを使っていないということだと思いますが、ご質問にあるようなプログラムのコンパイルをする場合は、 (1)提供されているライブラリから必要なヘルパ関数を抜き出し、サブセットのライブラリを作る。 (2)使用しているヘルパライブラリのサブセットの互換ライブラリを自作する。 (3)ヘルパ関数を使わないようにプログラム側を修正する。 などのなかから、現在の事情にあった方法を選択するという形になると思います。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

早速の回答ありがとうございます。 この回答をヒントに何故ライブラリ参照が行われていないのかを調査した所、SAMPLEのコンパイルバッチファイルのリンカオプションコマンドの中に標準ライブラリ参照が含まれていない事がわかりました。この参照を追加した所OKとなりました。初心者にはなかなか難しいです。 ありがとうございました。

関連するQ&A

  • cygwin gcc c99 での isnormal と strtold の使用

    Cygwinのgccで-std=c99オプションを付けて 以下のコードをコンパイルしようとしています。 #include <stdlib.h> #include <math.h> int main() { isnormal(0.123); strtold("0.123", NULL); return 0 ; } $> gcc -std=c99 test_strtold.c ですが、コンパイルできず、2つの関数とも'undefined reference'になります。 -std=c99を付けてコンパイルする方法または この記述と同等の別の記述がありましたらご教授願います。 よろしくお願いいたします。

  • MinGW-gccでの実行ファイル作成法

    今まで、visual studio 2008を使用して、実行ファイルを作っていたのですが、 今回、gccで実行ファイルを作らなければいけなくなりました。 どなたかどういったコマンドオプションを用いれば実行ファイル作成までたどりつくのか 知っている方がいれば教えていただきたいです。 ちなみに、現在 >g++ -o p -O3 -lm ./src/p.cpp ./src/m.cpp -L ./ -lica とコマンドを打っていますが : undefined reference to `_imp___Z13icaPdiiS_b'  とリンクが上手くいっていない感じのエラーが返ってきます。 このエラーの改善方法についてもぜひどなたかご教授ください。 お願いします。

  • gcc使用時のエラー

    現在openCVで画像処理プログラミングを行おうとしております。 一通りコーディングが終わった所でgccを使用してコンパイルをかけた所、 下記のようなエラーが出ました。 (コード中でhighgui.h及びcv.hをインクルードしています。) /tmp/cch6hMvI.o: In function `cvDecRefData': test.c:(.text+0xaa6): undefined reference to `cvFree_' test.c:(.text+0xb2e): undefined reference to `cvFree_' これはライブラリへのパスが通っていないものと思い、端末から export LD_LIBRARY_PATH=/usr/local/lib/ としましたが、それでもエラーが出ます。さらに下記も試してみましたが同様です。 gcc -L/usr/local/lib -o test test.c (/usr/local/lib/以下にlibopencv_core.so.2.4等が置いてあります。) pkg-configを使用すればコンパイルは通るのですが、 何がどうなってエラーになっているのかイマイチ分からず気持ちが悪いです。 1、上記エラーは共有ライブラリへのパスが通っていないために起きているものですか? 2、そうだとすれば、-Lやexport LD_LIBRARY_PATHで解決出来ないのは何故でしょう? 上記だけで情報が不足している場合は提示致しますので、 どうぞよろしくお願い致します。

  • sendmailのコンパイルエラーについて

    教えてください。>_< お願いします。 sendmail-8.12.2のインストールを試みたのですが、 エラーが返ってきます。 このエラーの意味、対処法などご存知の方 教えてください。 <エラー内容> domain.o: In function `getmxrr': domain.o(.text+0x25f): undefined reference to `__res_query' domain.o(.text+0x266): undefined reference to `__res_search' domain.o(.text+0x39b): undefined reference to `__dn_skipname' domain.o(.text+0x496): undefined reference to `__dn_expand' domain.o(.text+0x603): undefined reference to `__dn_expand' domain.o: In function `dns_getcanonname': domain.o(.text+0xf0c): undefined reference to `__res_querydomain' domain.o(.text+0x100f): undefined reference to `__dn_skipname' domain.o(.text+0x123f): undefined reference to `__dn_expand' domain.o(.text+0x128a): undefined reference to `__dn_expand' sm_resolve.o: In function `parse_dns_reply': sm_resolve.o(.text+0x17e): undefined reference to `__dn_expand' sm_resolve.o(.text+0x1fe): undefined reference to `__dn_expand' sm_resolve.o(.text+0x2e5): undefined reference to `__dn_expand' sm_resolve.o(.text+0x337): more undefined references to `__dn_expand' follow sm_resolve.o: In function `dns_lookup_int': sm_resolve.o(.text+0x612): undefined reference to `__res_search' collect2: ld returned 1 exit status make: *** [sendmail] エラー1 gccはバージョン2.96-81です。 OSはRedhatLinux7.1Jです。 よろしくお願いします。m(_)m

  • MingwでC++のソースがコンパイルできない。

    質問があるのですがよろしくお願いしします。 プラットフォームは Windows HOME です。 MinGWでC++のhelloworld.cppという名前のプログラム ------ここから----------- #include <iostream> using namespace std; int main(){ cout <<"Hello World!!\n"; return 0; } -------ここまで----------- を、gcc helloworld.cpp とWindowsのコマンドプロンプトから打ってコンパイルしようとしたのですが、 undefined reference to std string::size() const undefined reference to std string::operator[](using int) const undefinrd reference to std::cout undefinrd reference to std::basic_ostream<char, std::char traits<char> >&, char const*) undefinrd reference to std::ios_base::Init::() undefinrd reference to std::ios_base::~Init::() などのエラーが出て、コンパイルできません・・ hello.cという名前のC言語プログラム --------ここから------ #include<stdio.h> int main(void){ printf("Hello GCC World on Windows!!\n"); } ------ここまで------- は、gcc hello.c で正常にコンパイルでき、生成したexeファイルも正常に動きます。 また、eclipse CDT上からc++プログラムをMinGWでコンパイルすることもできるのですが・・ なぜかWindowsのコマンドプロンプトからc++プログラムをコンパイルしようとするとエラーが出てしまいます。(C言語のプログラムでもエラーが出ることが時々あります。) どなたか詳しい方いらっしゃいましたらご教授頂けると幸いです。 よろしくお願いします。

  • C言語コンパイラーエラーについて教えてください。

    C言語でコンパイルができなくて困っています。 コンパイルをすると、 ----------------------------------------- test.c.20:undefined reference to `getcury' test.c:20: undefined reference to `getcurx' collect2: ld returned 1 exit status ----------------------------------------- と言うエラーが出てしまい、コンパイルが完了しません。 ソースは、「test.c」と言うファイルネームで、内容は ----------------------------------------- #include <stdio.h> #include <stdlib.h> #include <curses.h> int main (void) { int y = 0, x = 0; initscr(); getyx(curscr, y, x); printw("x = %d, y = %d", x, y); refresh(); getchar(); endwin(); return 0; } ----------------------------------------- です。 OSは、Windows7 Professional SP1 コンパイラーは、MinGW Ver5.1.6. で、コマンドは gcc -o test.exe test.c -lcurses です。 確かに、curses へはパスも通っており、リンクできているようなんですが、 エラーが出てしまいます。 どうすれば良いのかわからず、大変困っています。 だれかご存知の方、教えてください。 どうかよろしくお願い致します。

  • gccの「-l」オプションとライブラリの関係

    gcc の -l オプションってどのような動作なのでしょうか?? sendmail関係の少々実験的な開発をするために、 OSに標準で入っているsendmail関係のライブラリである、   /usr/lib/libmilter.a   /usr/lib/libmilter.so   /usr/lib/libmilter.so.3 を削除して、 sendmailをソースからコンパイルして、 sendmailのソースの中のlibmilterもコンパイルしました。 この時点で、libmilter.a は、コンパイルしたディレクトリ(/usr/local/src/sendmail-8.14.2/)の下の   /usr/local/src/sendmail-8.14.2/obj.FreeBSD.6.2-RELEASE.i386/libmilter/ の中にしか存在しないのですが・・・ gcc -pthread -lc_r \   -L/usr/local/src/sendmail-8.14.2/obj.FreeBSD.6.2-RELEASE.i386/libmilter/ \   -lmilter \   test.c としてコンパイルしようとすると、libmilter の中にある関数が、 ことごとく「undefined reference」になってしまいます。 これを、-L や -lオプションでライブラリを探させるのをやめて、明示的に gcc -pthread -lc_r \   test.c \   /usr/local/src/sendmail-8.14.2/obj.FreeBSD.6.2-RELEASE.i386/libmilter/libmilter.a と書くと、問題なくコンパイル&リンクできるのですが・・・ なぜなのでしょうか??

  • コンパイル時のエラー

    UNIXでサーバー、クライアントのCプログラミングをテキストどおりに書いてコンパイルしたのですが、以下のエラーが出ます。gcc, ccでコンパイルすると以下のようになるのですが、これはどういうことなのでしょうか?何が原因なのでしょうか?よろしくお願いいたします。 gcc unix_server.c /var/tmp/ccvpay1f1.o: In function `main': /var/tmp/ccvpay1f1.o(.text+0x8c): undefined reference to `socket' /var/tmp/ccvpay1f1.o(.text+0x104): undefined reference to `unllnk' /var/tmp/ccvpay1f1.o(.text+0x118): undefined reference to `bind' /var/tmp/ccvpay1f1.o(.text+0x150): undefined reference to `listen' /var/tmp/ccvpay1f1.o(.text+0x1a8): undefined reference to `accept' cc unix_server.c ld: /usr/lib/cmplrs/cc/crtn.o: Error: Unresolved: rindex socket bzero bcopy unllnk bind listen accept

  • C言語のpow関数の不具合

    linux(ubuntu)の上でgccを使っています。 powの関数がおかしいです。 pow(10,-1)を計算させると正しく1e-1が出力されます。 #include <math.h> #include <stdio.h> int main(void){ double x = -1; printf("%f",pow(10,x)); return 0; } 上記のプログラムを走らせると、 In function "main"; *****.c:(.text+0x2d):undefined reference to 'pow' collect2: ldはステータス1で終了しました。 というエラーメッセージがでます。 なぜかpow関数の中に変数を入れるとプログラムが動きません。

  • 掛け算について

    いつもお世話になります。 変数サイズと掛け算について教えてください。 下記の2通りの変数の場合、 (1)int test = 307600000 * 8; (2)int test = 2460800000; (1)は、整数定数がオーバーフローしましたというエラーになり、 (2)はエラーになりません。(2)の値は(1)の掛け算の結果です。 質問は、 1.なぜ(1)はダメなのか? 2.(1)をエラーをなくすにはどの変数型宣言をしなければならないのか? よろしくお願い致します。

専門家に質問してみよう