マイコンSHでSQRT(平方根)が使えない理由

このQ&Aのポイント
  • マイコンSHでSQRT(平方根)が使用できない理由について説明します。
  • 開発環境はルネサスHEWで、プログラム内でSQRT(平方根)を使用しようとしたところ、リンクでエラーが発生しました。
  • エラーメッセージによれば、未定義の外部シンボル「_sqrt」が参照されているということです。
回答を見る
  • ベストアンサー

マイコンSHでSQRT(平方根)が使えません。なぜかしら?

マイコンSHでSQRT(平方根)が使えません。なぜかしら? 開発環境はルネサスHEWです。 (SuperH RISC engine C/C++ Compiler Package V.9.03 Release 00) プログラムは下記のような簡単なものです。 リンクでエラーになります。 L2310 (E) Undefined external symbol "_sqrt" referenced in "ファイルネーム" 未定義ということのようですが,よくわかりません。 どなたかお助けください。 宜しくお願いします。 ------------- 記 ------------- #include <math.h> { double ret; ret=sqrt(4.0);   ・   ・ }

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

  • ベストアンサー
  • mintia007
  • ベストアンサー率59% (16/27)
回答No.3

プロジェクト作成時「math.h:数値計算用ライブラリ」というチェック項目がありますので、そこにチェックを入れないとmath関連のライブラリを使用できません。もう一度、プロジェクト作成し直してみてください。

uekinda
質問者

お礼

回答ありがとうございます。 腑に落ちました。 実際動きました。 助かりました。

その他の回答 (2)

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.2

ライブラリのリンクが必要でしょう。 開発環境によって異なるのでマニュアルを参照ください。 ちなみにLinux/GCCだと-lmオプションのようです。 # http://www.linux.or.jp/JM/html/LDP_man-pages/man3/sqrt.3.html

参考URL:
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/sqrt.3.html
uekinda
質問者

お礼

回答ありがとうございました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

何かライブラリを指定する必要があったりしませんか? コンパイラのマニュアルを読んでください.

uekinda
質問者

お礼

回答ありがとうございました。

関連するQ&A

  • リンカのエラー

    SH-7144Fマイコンの開発をしています。 リンカで以下のようなエラーが出て困っています。 L2310 (E) Undefined external symbol "_set_imask_ccr" referenced in "C:\Users\***\Desktop\***\***\Debug\isac.obj" machine.hはincludeしていますし、何が原因かわかりません。 IDEはHEW4を使用しています。 何方かお願いします。

  • <math.h>があるのにsqrtが・・・

    最初にあるプログラムを作っていたのですが、その祭sqrtでエラーが出てしまったので、別にsqrtを使う短いプログラムを作りました。それが以下のものになります。(test3.c) 「 #include<stdio.h> #include<math.h> int main(void){ int atai; double x=2.0; atai=(int)sqrt(x); printf("atai is %c",atai); } 」 sqrtが動作するか確かめる為のものです。このプログラム(test3.c)で以下のエラーが出てしまいました。 「 /tmp/ccqEejZ1.o(.text+0x4d): In function `main': test3.c: undefined reference to `sqrt' collect2: ld はステータス 1 で終了しました 」 ちなみにLinux(Fedora core 4)を使用しています。 初心者ということもありなぜエラーが出るのか分かりません。 ちなみに<math.h>を使用しないプログラムは普通に動作します。 解決方法をご存知の方がいらっしゃいましたらご教授下さいませ。 よろしくお願いします。

  • sqrtを知らないと言われます

    #include <stdio.h> #include <math.h> int main() { double x; for (x=0.0; x<=10.0; x+=1.0){ printf("The square root of %f is %f\n", sqrt(x)); } return 0; } をgcc -lm XXX.cでコンパイルしようとすると XXX.c:関数:'main'内: XXX.c:9:3: 警告:書式'%f'は対応した'double'引数が予期されます[-Wformat]/tmp/ccPq0KS7.o: In function 'main'  XXX.c: (text+0x2d) undefined reference to 'sqrt' collect2: ldはステータス1で終了しました、 となります。相当な素人ですがどなたか問題点をご指摘いただければと存じます。

  • ルネサスマイコンへの書き込みについて

    C言語で作成したプログラムをルネサスマイコン"SH7045"で動作させるためにはどうしたらいいのでしょうか? 開発ツール"HEW"を用いてプログラムを作成し、フラッシュ開発ツールキット (Flash Development Toolkit) というものを使えばいいと思っていますが、合っていますか? ここからがよく分からないのですが、SH7045を使用した自作基板とPCとの接続はどのようにしたらいいのでしょうか? RS232Cで直接接続するだけでは駄目ですか?間に何かいるのでしょうか?

  • CとC++のファイルがあるプロジェクト

    超初心者です(><) ルネサスの統合環境HEW3を使っています。 自分で書いたプログラムはC++、統合環境で用意されているプログラムはCです。 「mainプログラム(C++)」+「統合環境で用意されているプログラム(C)」のプロジェクトは問題なくビルドできるのですが、 「mainプログラム(C++)」+「C++プログラム」+「統合環境で用意されているプログラム(C)」のプロジェクトはビルドできなくて困ってます。 「C++プログラム」+「統合環境で用意されているプログラム(C)」のリンクができなくて怒られてると思うのですが、どの辺に見当をつけて調べればいいのかすらわかりません(><) エラーメッセージは、 Phase OptLinker starting L2310 (E) Undefined external symbol "init_datasheet()" referenced in "C:\Hew3\MMT56_3\MMT56_3\Debug_SH-2_E10A-USB_SYSTEM\MMT56_3.obj" Optimizing Linkage Editor Abort Phase OptLinker finished この、"init_datasheet()" という自作の関数を「C++プログラム」に書き、「mainプログラム(C++)」と「統合環境で用意されているプログラム(C)」内で使おうとしています。 今後のためにも、対処法をご教授くださいm(__)m 「プログラムを全てCで書けば?」とか「C++で書く必要あるの?」とかあしらわないで下さいね(^^;;

  • 組み込み用マイコンのスタックについて

    お世話になっております。 現在、ルネサスのH8マイコンの開発を勉強しております。 その一環として、以前に他の人が作ったプログラムを調べたりしているのですが、スタックサイズの計算方法が分かりません。 本来純正のコンパイラであるHEWを使っていれば、付属のツールでスタックの計算が出来ることは知っているのですが、それらのプログラムは、 ・秋月のAKI-H8についてくるCコンパイラ ・BestTechのgcc用コンパイラGDL などで開発されているので、統合開発環境であるHEWのように便利なツールはついていません。 とはいえ、本来、そんなツールが無くてもスタックの計算は必須事項だとは分かっているのですが、どうやって計算したものか悩んでいます。 ソースファイルをHEW用に書き直すという手もあるのですが、ツールに頼らない 根本的なスタックの計算手法を身につけたいと考えています。 上記のコンパイラを使った場合のスタック計算について、皆様のアドバイスを頂きたいと思います。 どうかよろしくお願い致します。

  • H8Sマイコンに新規printfを追加でエラー

    前回、 http://okwave.jp/qa/q9191153.html こちらのサイトでH8S2368にprintfを追加したい内容の質問をした時の続きです。 現在、 イチから作って丸ごと学ぶ! H8マイコン道(12):シリアル通信でオリジナルprintf関数を作ろう (3/3) - MONOist(モノイスト) http://monoist.atmarkit.co.jp/mn/articles/1003/26/news096.html こちらのサイトの内容を参考に、printfのサンプルコードを追加してみました。 https://github.com/KenjiMaehara/ios_apply_test/blob/20150720_test/H8S2368_console/console/console.c しかし、コード追加後にコンパイルを実施すると次のようなエラーが発生します。 (コンパイルエラー内容) HMAKE MAKE UTILITY Ver. 2.1.00.000 Copyright (C) 2001,2006 Renesas Technology Europe Ltd. Copyright (C) 2001,2006 Renesas Technology Corp. and Renesas Solutions Corp. Executing Hitachi H8S,H8/300 C/C++ Library Generator01 phase set CH38TMP=C:\Users\KMAEH_~1\AppData\Local\Temp set PATH=c:\program files (x86)\renesas\hew\tools\renesas\h8\6_2_2\bin set CH38=c:\program files (x86)\renesas\hew\tools\renesas\h8\6_2_2\include Executing Hitachi H8S,H8/300 C/C++ Compiler02 phase "c:\program files (x86)\renesas\hew\tools\renesas\h8\6_2_2\bin\ch38.exe" -ws=C:\Users\KMAEH_~1\AppData\Local\Temp\hmk6689.tmp Executing Hitachi H8S,H8/300 Assembler03 phase Executing Hitachi OptLinker04 phase "c:\program files (x86)\renesas\hew\tools\renesas\h8\6_2_2\bin\LnkSpawn.exe" -subcommand=C:\Users\KMAEH_~1\AppData\Local\Temp\hmk6A82.tmp ** L2310 (E) Undefined external symbol "_mprint_test_sci1" referenced in "..\myproject\obj\main.obj" Optimizing Linkage Editor Abort ERROR: Process failed with return code: 1 mprint_test_sci1という関数の宣言は #include "all_includes.h" こちらのヘッダーファイルに (all_includes.hの内容の一部) extern void outs_sci1(char *, short); extern void outc_sci1(char, short); extern void outn_sci1(char, unsigned long, short); extern void mprint_test_sci1(char *fmt, ...); extern void charput_sci1(char OutputChar); このような形で宣言しています。 しかし、エラーが出てくるのですが、これをどのように解決すればよいのかご教示頂きますよう、よろしくお願い致します。

  • HEW4での通信エラーについて

    HEW4での通信エラーについて ルネサスのR8C/29マイコンを使用しているのですが、 HEW4で作ったプログラムをマイコンにダウンロードする際に、 「通信エラーが発生しました。ターゲットよりデータを受信できません。 (16014)」 と表示され、通信ができません。 どうしたら通信できるようになるのでしょうか? ソフトのインストールで失敗しているのか、ケーブルの接続で失敗しているのか、よくわかりません。 もしわかる方がいらっしゃれば、回答よろしくお願いします。 ここに書いた内容で足りない情報があれば、わかる範囲で記述させていただきます。 当方初心者ですので、誤った言葉の表記がありましたら申し訳ありません。 マイコンとPCは、USB-シリアルケーブルで接続しています。 OSはWindows XPです。

  • H8マイコン スタック領域について

    スタック領域について教えて下さい。 [動作環境]  開発環境:ルネサス HEW Version 4.08  マイコン:ルネサス H8/1653  コンパイラ:H8SX,H8S,H8ファミリ用C/C++コンパイラパッケージ V7.00 HEWにて新規作成しますと、セクション定義にスタック領域(S)のアドレスと stacksct.h 内に スタック領域のサイズ #pragma stacksize 0x200 が自動で生成されると思います。 しかし、入手したH8/1653用のサンプルには #pragma stacksize のような サイズ指定がありませんでした。 [サンプル] (1)セクション定義やスタック領域のサイズ指定が無い (2)サブコマンドファイル(xxxx.sub)内でアドレスは設定されているが サイズの設定が無い。 -- サブコマンドファイル(xxxx.sub)-- START  CStart/00000000; START  P,C,D/00000400; START  B,R/00FF2000; START S/00FFC000; [質問]  質問1   (1)のスタック領域はどこに配置されるのでしょうか?  質問2   (2)のスタック領域は 00FFC000 を基準にどう確保   されるのでしょうか? (a)の方向へ確保?(b)の方向へ確保?          00F00000 (a)         ↑       00FFC000 (設定アドレス)         ↓       00FFFFFF (b)        質問3   (1)、(2)共にスタック領域と同時にヒープ領域も指定がありません。   これらは指定しなくても問題ないものなのでしょうか?   また、熟練者の方は指定しないものなのでしょうか? よろしくおねがいします。

  • 割り込みベクターをC言語で書きたい

     皆さん、有難う御座います。時々質問させて頂いています。  今回は、ベクターアドレスをC言語で書く方法について質問します。  ルネサスのH8マイコンを使っています。モニターを使うとRAM上に割り込みの仮想ベクターを作れます。  仮想ベクターには、割り込みのジャンプ先アドレスが書かれます。  現在アセンブラで書いているのですが、C言語で書く方法は無いでしょうか。  二つの方法で書きたいと思っています。  アセンブラで次の二つの方法に相当するC言語命令を知りたい。 (1)ORGとEQU命令を使った方法 (2)ムーブ(Z80ならロード)命令で関数のアドレスをメモリに書く方法  ルネサスにはHEWと言うソフトが有りますが、HEW特有の命令によらず、一般的なコンパイラが持っている機能で実現したい。  以上宜しくお願いします。

専門家に質問してみよう