gdbデバッグのためのmakefile作成

このQ&Aのポイント
  • Ubuntu Linuxでgccプログラミングを行い、ソースコードを複数のファイルに分割しています。
  • makefileを使用してmakeして実行ファイルを作成していますが、現在のmakefileではgdbでのデバッグができません。
  • gdbでデバッグできるようなmakefileの書き方を教えていただきたいです。
回答を見る
  • ベストアンサー

gdbデバッグのためのmakefile作成

現在Ubuntu Linuxでgccプログラミングを行っています。現在、ソースコードをいくつかのファイルに分割して作成しています。コンパイル時はmakefileを使用してmakeして実行ファイルを作成しています。 現在のプログラムをgdbでデバッグできるようにしたいと思っているのですが、 その場合のmakefileはどのようにして書けば良いのかをご教示頂きますよう、お願い致します。 現在のmakefile内容 https://sourceforge.jp/projects/cc1101driver/scm/svn/blobs/2319/trunk/20140411/Makefile #test #CC = gcc #test:main.c event.c exe: main.o event.o env.o audio.o task.o comm.o menu_show_status.o gcc -o exe main.o event.o env.o audio.o task.o comm.o menu_show_status.o -lpthread main.o:main.c gcc -c main.c event.o:event.c gcc -c event.c env.o:env.c gcc -c env.c audio.o:audio.c gcc -c audio.c task.o:task.c gcc -c task.c comm.o:comm.c gcc -c comm.c menu_show_status.o:menu_show_status.c gcc -c menu_show_status.c

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

  • ベストアンサー
  • wormhole
  • ベストアンサー率28% (1622/5659)
回答No.1

gccのコンパイルオプションに-gを追加する。

techhouse
質問者

お礼

回答頂きありがとうございます。返事遅くなり申し訳ありませんでした。 makefileでデバッガ用の実行ファイル出力できるようになりました。 https://sourceforge.jp/projects/cc1101driver/scm/svn/blobs/head/trunk/20140411/Makefile

その他の回答 (3)

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.4

http://svn.sourceforge.jp/svnroot/cc1101driver/trunk/20140411 リポジトリブラウザで見るとヘッダファイルはあるようですね。 ヘッダファイル更新してもmakeはコンパイル対象とする必要は無いのかと。

techhouse
質問者

お礼

回答頂きありがとうございます。返事遅れて申し訳ありません。 makefileでデバッガ用の実行ファイル出力できるようになりました。 https://sourceforge.jp/projects/cc1101driver/scm/svn/blobs/head/trunk/20140411/Makefile ちょっとこのときに参考にしたサイトも記述させて頂きます。 http://okuyama.mt.tama.hosei.ac.jp/unix/C/slide85.html makefile中のCFLAGSとかの使い方が少しわかるようになり大変勉強になりました。

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

まじめな話として, こんだけファイルがあってヘッダは 1つもないんだろうか.

techhouse
質問者

お礼

回答頂きありがとうございます。返事遅れて申し訳ありません。 makefileでデバッガ用の実行ファイル出力できるようになりました。 https://sourceforge.jp/projects/cc1101driver/scm/svn/blobs/head/trunk/20140411/Makefile

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

>main.o:main.c >gcc -c main.c >event.o:event.c >gcc -c event.c 個別に書かなくても、ある程度自動で処理してくれると思われますが。 http://minus9d.hatenablog.com/entry/20140203/1391436293 のパターンルールとか。 他のオープンソースのMakefileなんかも参考になるかと。 んで…パターンルール使うならCFLAGSとかにオプションを追加指定あればよいと思われます。 あと……どうでもいいですけど、エディタが作成するバックアップファイル(*.BAK)や、コンパイル時の中間ファイルや他社の著作物(*.pdf)とか……なんでもかんでもリポジトリに登録するのは如何なものかと思われますよ? 以前にも指摘したような気がしますけど。 sourceforgeのディスクスペースを無意味に消耗するのもどうかと…。 # ビルド生成物(実行ファイルとか)も含めるかは微妙なとこですかねぇ。 # 個人的には含めないんですが、派遣先では最近は含めてますね。 # TortoiseSVNはインストールしてあってもビルド環境はセットアップしていない。なんて利用者の方も居るので。 # そんなワケでC#のプロジェクトでバージョン情報のフォームに出力する日付は実行ファイルのタイムスタンプではなくアセンブリに格納したビルド日時。

techhouse
質問者

お礼

回答頂きありがとうございます。返事遅れて申し訳ありません。 makefileでデバッガ用の実行ファイル出力できるようになりました。 https://sourceforge.jp/projects/cc1101driver/scm/svn/blobs/head/trunk/20140411/Makefile ちょっとこのときに参考にしたサイトも記述させて頂きます。 http://okuyama.mt.tama.hosei.ac.jp/unix/C/slide85.html makefile中のCFLAGSとかの使い方が少しわかるようになり大変勉強になりました。

関連するQ&A

  • Makefile作成時の拡張子.oとは?

    main2.o: main.c gcc -o main2.o -c main.c hello2.o: hello.c gcc -o hello2.o -c hello.c test2: main2.o hello2.o gcc -o test2 main2.o hello2.o のようなMakefile作成時の拡張子.oとは何のファイルという意味なのでしょうか? Makefile作成初心者なのでご教授お願いいたします。

  • makefileを実行すると・・・

    タイトルの通り、makefileを実行したところ、次のようなエラーが出ました。 make: *** No targets. Stop. 考えられる理由としては、何がありますでしょうか? ちなみにmakefileを使わず普通に実行すると成功したので、makefile自体に問題があると思います。 使用しているのはMacのターミナルです。 次がmakefileの内容です。 #Makefile CC = gcc CFLAG = -03 MFLAG = -lm SRC = main.c open.c read_write.c OBJ = main.o open.o read_write.o all:dummy dummy:$(OBJ) $(CC)$(CFLAG) -o dummy $(OBJ) $(MFLAG) main.o: main.c $(CC)$(CFLAG) -c main.c open.o: open.c $(CC)$(CFLAG) -c open.c read_write.o: read_write.c $(CC)$(CFLAG) -c read_write.c clean: rm -f *.o

  • C言語のmakefileについて

    C言語のmakefileについて質問です。 例えば下記makefileでは、“CC”というマクロを“gcc”という文字列で再定義しています。 しかし中には(1)『CC = gcc』という定義なしでいきなり(2)『$(CC) -o hello $(objs)』 でコンパイルしているmakefileを見るのですが、その場合(2)は何でコンパイルされているのでしょうか。($(CC)の中身はCC??GCC?ACC??) ※下記ターゲット名等はサンプルです。 ------------------ # Makefile objs = hello.o edajima.o CC = gcc hello: $(objs) $(CC) -o hello $(objs) .PHONY: clean clean: $(RM) hello $(objs)

  • Makefileと共有ライブラリ

    main.c sub1.c sub2.cに対して 共有ライブラリlibsub1.soとlibsub2.soを生成して それをもちいてmainをコンパイルするMakefileを以下のように記述しました。 CC=gcc LIB= CFLAGS=-Wall TARGET = main SHAD = -shared .SUFFIXES:.so .o SRCS = main.c libsub1.so libsub2.so $(TARGET):$(SRCS) $(CC) -o $@ $(SRCS) @echo "make finished!!" #.o.so: # $(CC) $(SHAD) -o $@ $< libsub1.so:sub1.o gcc -shared -o libsub1.so sub1.o libsub2.so:sub2.o gcc -shared -o libsub2.so sub2.o .c.o: $(CC) -c $< #sub1.o:sub1.c # gcc -c -fPIC sub1.c #sub2.o:sub2.c # gcc -c -fPIC sub2.c clean: @rm -f libsub?.so sub?.o ここで.oから.cを生成するのはサフィックスでできたのですが、同じように.oから.soを生成するのは できませんでした。 #.o.so: # $(CC) $(SHAD) -o $@ $< ここはどのように記述したらいいのでしょうか? 回答お願いします。

  • Makefileについて

    makeファイルの書き方で悩んでいます。 makeファイルは書いたことがなく、ほとんど丸写しです。 私がしたいのは、 (1)run:部分で削除するファイルがなかった場合、エラーとなり次の行へ進みません。なくても(エラーでも/エラー回避して)次の行へ進む方法が知りたいです。 もうひとつは(2)run:部分で、cleanを実行し、makeしてrunを実行させる方法が知りたいです。 --------------以下、サンプルMakefileです。 CC = gcc OBJS = main.o sub.o PROG = test.exe .c.o: $(CC) -c $< -o $@ $(PROG) : $(OBJS) $(CC) $(OBJS) -o $(PROG) $(OBJS) : Makefile clean: rm -f *.o $(PROG) run: rm *.log <---- (1)ここでファイルがないとエラーで止まる $(PROG) all:   <-- (2)[clean]を実行して、makeして、[run]を実行させたい 以上です。

  • makefileの書き方

    makefileを書いたのですが、コンパイルしたあとに、main.cppの内容を変更してから、またmakeってタイプして変更した箇所が反映されません。どこがおかしいでしょうか?よろしくお願いします。 program : main.o g++ -o program main.o main.o : main.cpp g++ -Wall -c main.cpp DeleteObj: rm main.o

  • Makefile と <math.h>

    C言語初心者です,Vine Linuxを使用しています. Makefileを用いたコンパイルをしたいのですが,あるcコード中にある,「sqrt」でコンパイラからエラー警告が出ます. エラーコード: gcc -o p001 pMain001.o pIo001.o pFnc001.o pFnc001.o(.text+0x214): In function 'sqr_Rt': : undefined reference to 'sqrt' collect2: ld はステータス 1 で終了しました make: *** [p001] エラー 1 Makefile: #Makefile for p001 CC = gcc p001: pMain001.o pIo001.o pFnc001.c $(CC) -o p001 pMain001.o pIo001.o pFnc001.o pMain001.o: pMain001.c pIo001.c p001.h $(CC) -c pMain001.c pIo001.c pIo001.o: pIo001.c p001.h $(CC) -lm pIo001.o pIo001.c pFnc001.o: pFnc001.c p001.h $(CC) -c p001.o pFnc001.c プログラムの概要: p001.hには,構造体定義と関数プロトタイプ宣言. pIo001.cには,キーからの入力と,出力の関数. pFnc001.cにはp001.hにある定義を用いた関数があり,この中にsqrtを使う関数がある. pMain001.cではpIo001.cとpFnc001.cにある関数を利用し,入出力を行う. Makefileの記述が間違っているような気がしてならないんですが,何せ勉強不足なものでよくわかりません. <math.h>はp001.hでインクルードしていますが,これは違いますか? 長文を読んで下さってありがとうございます,「ココおかしい」などの指摘お待ちしています;;

  • Makefileについて

    同じディレクトリに、同名のa.plとa.cファイルが存在します。 それぞれは単独では問題なく動きます。 しかし、Makefileを使ってこれらのファイルを一緒に実行させたいのですが、make allrunでa.pl、a.cが実行された後に make: *** [allrun] エラー 14 と出てしまいます。 結果的には全て実行できた形になるのですが、エラーと出ているのでどうも不安です。 勉強中の身なので説明がうまくいっていないと思いますが、どうやればよいのか教えてください。 Makefileの中身は CC = gcc all:a a a:a.c $(CC) -o a a.c -lm allrun:a a ./a.pl ./a.out clean: -rm ./a -rm ./a です。

    • ベストアンサー
    • Perl
  • multiple definitionというエラー

    現在Ubuntu LinuxのgccでC言語のプログラムをやっています。 https://sourceforge.jp/projects/cc1101driver/scm/svn/blobs/2452/trunk/20140411/code.h このツリーのcode.hに ”const sig_code2_t PVC_TCP_SIG_CODE[100] = {” というコードを追加してmakeを行うと次のようなエラーが出て実行ファイルが出力されません。 (エラー内容) ---------------(中略)----------------- gcc -o exe main.o event.o env.o audio.o task.o comm.o menu_show_status.o mount.o net.o misc.o -lpthread event.o:(.rodata+0x0): multiple definition of `PVC_TCP_SIG_CODE' main.o:(.rodata+0x0): first defined here env.o:(.rodata+0x0): multiple definition of `PVC_TCP_SIG_CODE' main.o:(.rodata+0x0): first defined here audio.o:(.rodata+0x0): multiple definition of `PVC_TCP_SIG_CODE' main.o:(.rodata+0x0): first defined here task.o:(.rodata+0x0): multiple definition of `PVC_TCP_SIG_CODE' main.o:(.rodata+0x0): first defined here comm.o:(.rodata+0x0): multiple definition of `PVC_TCP_SIG_CODE' main.o:(.rodata+0x0): first defined here mount.o:(.rodata+0x0): multiple definition of `PVC_TCP_SIG_CODE' main.o:(.rodata+0x0): first defined here net.o:(.rodata+0x0): multiple definition of `PVC_TCP_SIG_CODE' main.o:(.rodata+0x0): first defined here misc.o:(.rodata+0x0): multiple definition of `PVC_TCP_SIG_CODE' main.o:(.rodata+0x0): first defined here collect2: error: ld returned 1 exit status make: *** [exe] Error 1 この const sig_code2_t PVC_TCP_SIG_CODE[100] = {をコメントアウト正常にビルドできるのですが、 この問題を解決するにはどうすれば良いのかご教示頂きますようお願い致します。

  • gfortranでmakefile

    gfortranのmakefileを作成し、"make test"と実行しても成功しません。 どうすればいいのでしょうか? どこか間違いがあるでしょうか? 下にmakefileを全文載せましたのでアドバイスをよろしくお願いします。 OBJS = main.o tree.o treef.o\ test : ${OBJS} gfortran -c test ${OBJS} main.fやtree.fやtreef.fのファイルの中身は問題ありません。 他のパソコンではキチンとコンパイルに成功しています。