• ベストアンサー

makefileってどうやるの?

MircosoftVisualStudio.NETでプログラミングしている者です(短い言い方無いですか?^^;)。 makefileという物は作った事あるのですが、上記ソフトを使えば簡単に作成できそうな気がするのにやりかたがよくわかりません・・; 1.cppに書いてあるプログラム中から2.cppに書いてある関数を呼び出すなんて事も可能なんですよね? 1にも2にもインクルードは同じ宣言するのでしょうか? こういうことが学べるサイト等ご存知でしたら教えてください>< また、直々に教えてくださる方お願いします!><

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

  • ベストアンサー
回答No.2

Visual Studio を普通にお使いであれば、makefile は、不要です。プロジェクトに必要なファイルを登録すれば、依存関係は自動的にチェックしてくれますから。 あと、分割コンパイルに関連するヘッダファイルの機能は、関数プロトタイプといって、関数の呼び出し側と定義側とで、関数の名前・引数の方・返り値が一致することを保証するためのものです。 通常、2.cpp で定義した関数のプロトタイプは、2.h というヘッダファイルに書きます。 そして、定義側(2.cpp)と、呼び出し側(1.cpp)で、2.h をインクルードします。 これにより、ヘッダファイルの内容と定義側の関数プロトタイプが、また、同じヘッダファイルの内容と呼び出し側の関数プロトタイプがそれぞれチェックされます。 この結果、呼び出し側と定義側の関数の形が一致することをチェックできます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.1

それはMakefileの問題ではなく「分割コンパイル」の問題ではないでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Makefileについて

    Qtで、ちょっとしたプログラムを書いたのですが、あえてqmakeは使わずに自分でMakefileを書いてみました。 以下、Makefileの内容(タブは全角空白2個に置き換えてます) #QtApp template #Variables #  Package infomation NAME        =  DPMWindow #  Resources C_SOURCE      =   CPP_SOURCE      =  src/DPMArk.cpp\           src/DPMMaster.cpp \           src/DPMNode.cpp \           src/DPMResult.cpp \           src/DPMWindow.cpp \           src/main.cpp MO_HEADER      =  include/DPMWindow.h UI        =  share/ui/DPMWindow/DPMWindow.ui OTHER_RESOURCE1      =  share/icons/DPMWindow/icon.png OTHER_RESOURCE2      =   #  Compiling settings DEFINE        =  -DPATH=\"/usr/local\" INC_DIR        =  include LIB_DIR        =   LINK_LIB_FLAG      =   PKG_CONFIG      =  `pkg-config --cflags --libs QtGui` OUTPUT_DIR      =  bin #  Install settings INSTALL_ROOT      =  /usr/local BIN_INSTALL_DIR      =  bin OTHER_RESOURCE1_INSTALL_DIR  =  share/icons/DPMWindow OTHER_RESOURCE2_INSTALL_DIR  = #Invariables #  Package infomation BIN_FILE_NAME      =  $(NAME) #  Resources MOC_CPP_SOURCE      =  $(MO_HEADER:%.h=%.mo.cpp) UI_HEADER      =  $(UI:%.ui=%.ui.h) OBJ        =  $(C_SOURCE:%.c=%.o) $(CPP_SOURCE:%.cpp=%.o) $(MOC_CPP_SOURCE:%.cpp=%.o) #  Compiling and Archiving settings OUTPUT        =  $(OUTPUT_DIR)/$(BIN_FILE_NAME) INCLUDE_FLAG      =  $(patsubst %,-I%,$(INC_DIR)) $(patsubst %,-I%,$(dir $(UI))) LIB_FLAG      =  $(patsubst %,-L%,$(LIB_DIR)) #  Commands CC        =  gcc -o CPPC        =  g++ -o CC_OBJ        =  gcc -c -o CPPC_OBJ      =  g++ -c -o MOC        =  moc-qt4 -o UIC        =  uic-qt4 -o RM        =  rm -Rf MKDIR        =  mkdir -p TEST        =  test -d INSTALL        =  install -m 0755 -p CP        =  cp -R #  Install settings INSTALLED_BIN      =  $(addprefix $(INSTALL_ROOT)/$(BIN_INSTALL_DIR)/, $(notdir $(OUTPUT))) INSTALLED_OTHER1    =  $(addprefix $(INSTALL_ROOT)/$(OTHER_RESOURCE1_INSTALL_DIR)/, $(notdir $(OTHER_RESOURCE1))) INSTALLED_OTHER2    =  $(addprefix $(INSTALL_ROOT)/$(OTHER_RESOURCE2_INSTALL_DIR)/, $(notdir $(OTHER_RESOURCE2))) all: $(OUTPUT) $(OUTPUT): $(UI_HEADER) $(OBJ)   $(CPPC) $(OUTPUT) $(OBJ) $(LIB_FLAG) $(LINK_LIB_FLAG) $(PKG_CONFIG) %.o: %.c   $(CC_OBJ) "$@" $(DEFINE) $(INCLUDE_FLAG) $(LIB_FLAG) "$<" $(LINK_LIB_FLAG) $(PKG_CONFIG) %.o: %.cpp   $(CPPC_OBJ) "$@" $(DEFINE) $(INCLUDE_FLAG) $(LIB_FLAG) "$<" $(LINK_LIB_FLAG) $(PKG_CONFIG) %.mo.cpp: %.h   $(MOC)"$@" "$<" %.ui.h: %.ui   $(UIC) "$@" "$<" clean:   $(RM) $(OBJ) $(MOC_CPP_SOURCE) $(UI_HEADER)   $(RM) ./*/*~ ./*~ install: install_bin install_other1 install_other2 install_bin:   $(TEST) $(INSTALL_ROOT)/$(BIN_INSTALL_DIR) | $(MKDIR) $(INSTALL_ROOT)/$(BIN_INSTALL_DIR)   $(INSTALL) $(OUTPUT) $(INSTALL_ROOT)/$(BIN_INSTALL_DIR)/$(LIB_FILE_NAME) install_other1: $(OTHER_RESOURCE1) $(OTHER_RESOURCE1):   $(TEST) $(INSTALL_ROOT)/$(OTHER_RESOURCE1_INSTALL_DIR) | $(MKDIR) $(INSTALL_ROOT)/$(OTHER_RESOURCE1_INSTALL_DIR)   $(CP) $(OTHER_RESOURCE1) $(INSTALL_ROOT)/$(OTHER_RESOURCE1_INSTALL_DIR) install_other2: $(OTHER_RESOURCE2) $(OTHER_RESOURCE2):   $(TEST) $(INSTALL_ROOT)/$(OTHER_RESOURCE2_INSTALL_DIR) | $(MKDIR) $(INSTALL_ROOT)/$(OTHER_RESOURCE2_INSTALL_DIR)   $(CP) $(OTHER_RESOURCE2) $(INSTALL_ROOT)/$(OTHER_RESOURCE2_INSTALL_DIR) uninstall: uninstall_bin uninstall_bin:   $(RM) $(INSTALLED_BIN) 以上、Makefileの内容 makeはちゃんとでき、プログラムも実行できるのですが、makeの最後に記述した覚えのない rm include/DPMWindow.mo.cpp が実行されます。 まぁ、別に困らないのですが、Makefileを何度か見直しても分からなかったので、原因が分かれば回答をお願いします。

  • makefileの書き方

    UNIX環境でC言語で作成したプログラムのコンパイルをmakefileを使用して行いたいのですが、 インクルードディレクトリの指定が無視されてしまいます。(CFLAG2の-o $@も) 何が問題なのでしょうか? ファイルの構成としてはとりあえず全て同じディレクトリに格納しています。 (3)だけであればインクルードディレクトリの指定等は問題なく展開され、 オブジェクトができあがります。 (1)(2)でロードモジュールを作成しようとすると質問の問題が発生します。 # CC = cc CFLAGS = -Aa -O -g -Y -D_HPUX_SOURCE CFLAGS2 = -o $@ -c # INCDIR = . SRCDIR = . OBJDIR = . INCLUDE = -I$(INCDIR) OBJS = TestMain.o MODULE = $(OBJDIR)/TestMain all: $(MODULE)  ・・・・・(1) $(MODULE): $(OBJS)  ・・・・・(2) $(CC) -o $@ $^ $(OBJDIR)/TestMain.o: $(SRCDIR)/TestMain.c $(SRCDIR)/TestCommon.c  ・・・・・(3) $(CC) $(INCLUDE)/ $(CFLAGS) $(CFLAGS2) $(SRCDIR)/TestMain.c $(SRCDIR)/TestCommon.c (タブは消えてしまいました)

  • ソースファイルの分割について

    a.h クラスの定義 a.cpp クラスのメンバ関数の定義 b.h #include "a.h" クラスの定義 b.cpp クラスのメンバ関数の定義 ----c.cpp---- #include "a.h" #include "b.h" a.hで定義したクラスの宣言 b.hで定義したクラスの宣言 メインの処理 ----------------------------------------- b.cppで定義しているクラスのメンバ関数にて a.cppで定義したクラスのメンバ変数にアクセスしたいのです。 どうするのが一番良いのでしょうか? a.cppにメンバ変数を返すだけの関数を定義してb.cppでc.cppで宣言したa.hのクラスを extern宣言してみたのですがエラーが出てコンパイルが通らないです。

  • 移植性の高いmakefileの作成

    移植性の高いmakefileの作成 C言語で書かれたソースファイルをmakeツールでビルドしています。 もともとコンパイラとして「Borland C++ Compiler 5.5.1」を使用し、Borland C++ 同ツール付属のmakeツール「MAKE Version 5.2」を使用していました。 makeの基本文法は理解しており、Borlandのコンパイラを使用している間は特に問題ありませんでした。 しかし最近、新たにGCC系列のMinGWという開発環境一式と、補助ツールMSYSを導入し、既存のmakefileをGCCおよびGNUmakeに対応させることにしました。 具体的には、 GMAKEを起動した場合はgccでコンパイルする。 Borland make を起動した場合にはbcc32でコンパイルする。 という切り替えを同一のmakefileで行おうと考えました。 しかし、ここで問題が発生しました。 makeの依存関係部分はborland付属make(以下Bmakeとします)とGNUmakeであまり違いはないのですが、単一のmakefileで対応しようとすると、どうしてもコンパイラオプションやコンパイルコマンドを切り替える部分が必要です。しかし、ifdefやincludeディレクティブに関してはお互いにまったく互換性がなく、片方のmakeで有効なフラグをつかってifdefで分岐しようとしても、もう片方では完全に文法エラーです。 例えば、ifdefやincludeディレクティブは、Bmakeでは先頭に!が必要ですが、GNUmakeには必要ありません。 以下の書籍でポータブルなmakefileの記述に関していろいろ調べたのですが、Bmakeの特殊な文法についての言及がなく、対応策が見つかりません。 様々な環境でビルドされるFireFox3.0のソースコードも参考にしようとmakefileと思われるファイルを全て検索したところ、1769個ほど見つかりました。 その中で!ifdefディレクティブを使用しているのは極わずかで、Makefile.winという名称のものがいくつかあっただけでした。 しかもそれらは最後の方にincludeディレクティブも使っていました。 例えば、MozillaFirefox3.0のソースコードにあるmakefaileの内、firefox-3.0-source.tar\mozilla\dbm\src\Makefile.winは「include <$(DEPTH)/config/rules.mak>等」、という一文がある一方、その他のifなどのディレクティブは頭に!をつけられており、全体としてはBmake(多分ターゲットはMSVC++だと思いますが。)です。 これはBmakeではエラーになるはずなのですが、動作機構は不明です。 また、条件付マクロというテクニックで、ある値が定義されていれば左値を、定義されてなければ右値を使ってマクロ置換するテクニックがあったので、これでディレクティブをマクロ置換してやろうと考えました。しかし、ディレクティブをマクロ定義することはできないようでこれも失敗しています。 #INCLUDE というマクロを定義して、 INCLUDE = $(_GNUMAKE_?include:!include) #マクロをディレクティブ命令として使う $(INCLUDE) testmake.mk それぞれのmake専用makefileを作るのは簡単ですが、新しいプログラムを追加するたびに複数のmakefileを書き直すのは避けたいのです。 長々と書きましたが、解決策として次の2つのいずれかのようなものがあれば教えていただきたいです。 1. ifやincludeディレクティブに代わる、GNUmakeとBmake両方に使えるテクニック。 2. 起動したmakeによって条件分岐、もしくは読み込むファイルを切り替えるテクニック。 よろしくお願いいたします。 開発環境 OS: winXP コンパイラ: 「Borland C++ Builder 6.0」「Borland C++ Compiler 5.5.1」「gcc version 3.4.5 (mingw special)」 make: 「MAKE Version 5.2 (C++ BuilderとC++ Compiler 5.5.1はおなじmakeを使用している模様)」「GNU Make version 3.79.1」 参考文献 1. 「GNU Make 第3版」オライリージャパン、2005年 2. 「C言語逆引き大辞典」秀和システム、2003年 3. 「GNUソフトウェアプログラミング」、?年

  • 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でインクルードしていますが,これは違いますか? 長文を読んで下さってありがとうございます,「ココおかしい」などの指摘お待ちしています;;

  • gccを使ってのリンク時のライブラリの指定法

    gccを使って、c++の勉強を始めようとしています。 hello.cpp(どこにでもある一行のプログラム)のコンパイルはできましたが、リンクができません。 私の機械では iostream は /usr/include/c++/3.3.2 にあります。( iostream.hは /usr/include/c++/3.3.2/backward にあります。) また、makefileにこの情報を書くには、どのように書けばよいのでしょうか。

  • 一つのソースユニットを複数のプロジェクトで共有したい

    BCB5を使っています。 複数のプログラムで共通な関数について、それらのプログラムで共有できるソースユニットを作ることが出来たら便利だと思っていますが、そんなことは可能でしょうか? 今三つのプログラム(A.exe、B.exe、C.exe)があるとします。 これらのプログラムの一部には、全く同じ処理があります。 それを関数Zf()とします。 で、Z.cppというユニットにこの関数を記述し、三つのプロジェクトで共有するのです。 この関数は仕様が完全に決まってはおらず、試行錯誤しながら決めて行くことになっています。 修正が多発するのですが、Z.cppを一つ修正すれば、再コンパイルだけで反映するので便利だ、という考えです。 私の知識では、一つのプロジェクトに新たなソースユニットを作る場合、そのユニットでは、呼ぶ側のヘッダーをincludeする必要があります。 今回の場合は、Z.cppは三つのプロジェクトに登録するわけですから、三つのヘッダーをincludeすることになってしまいます。 A.hとB.hを見ると同じ名前の変数や関数があり、これを同時にincludeするとマズイ事になりそうな気がします。 呼ぶ側のヘッダーをincludeせずに共有することは可能なのでしょうか? ちなみに関数Zf()では、グローバル変数は使っていませんし、他のユーザ関数を呼ぶこともありません。 シロートの質問ですがよろしくお願いします。

  • BCC5.5のMakeFileについて教えてください。

    小生、只今、WinXPSP3上でC言語を使い、BCC5.5.1でコンパイルしながらプログラミングを勉強しています。 今回質問させて頂きたいのがBCCのMakeFileについてです。 http://blog.tomnekosoft.com/tomnekosoft.php?itemid=645 上記のサイトから、BCCのMakeFileというものを始めて知り、 その内容を理解したいと思いました。 以下にそのMakeFileを記述させて頂きます。 # # make -f fb_sample.mak # # ここの箇所は理解できました。 CFLAGS = -c -w- -a4 -DWIN32 -tWC -IC:\bin\bcc55\include LFLAGS = /m /s /Tpe -LC:\bin\bcc55\Lib LIBS = fbclient_bor.lib CC = bcc32 LINK = ilink32 # この.SUFFIXESというのがわかりません。 .SUFFIXES: .c .obj .c.obj: $(CC) $(CFLAGS) $< # この下も一切わかりません。 fb_sample.exe: fb_sample.obj @echo c0x32.obj+ > link.arg @echo $? >> link.arg @echo $@ >> link.arg @echo $(LFLAGS) >> link.arg @echo $(LIBS)+ >> link.arg @echo import32.lib+ >> link.arg @echo cw32.lib >> link.arg $(LINK) @link.arg 以上です。 分からない場所は、.SUFFIXESとfd_sample.exeから始まる箇所です。 お忙しい中、申し訳ございませんが、先輩方ご教授宜しくお願い致します。

  • 他の.CPPファイルに定義した関数を呼び出す方法について

    新規作成したプロジェクトに、 以前自分が作成した.cppファイルと.hファイルを そのまま使えないかと考えています。 (※仮にそのファイルの名前を "define.cpp" "define.h" とします) プロジェクトに新規ファイル main.cpp を作成して、 define.hをインクルードし、 以下のようなテストのプログラムを組みました。 ・../util/define.cpp---------------------- #include <iostream> #include "define.h" void test(){ std::cout<<"test."<<std::endl; } ・../util/define.h------------------------ #pragma once void test(); ・main.cpp---------------------------- #include "../util/define.h" int main(){  test();  return 0; } 上記のソースを VisualC++7.0 でビルドすると、 main.cppの3行目で以下のようなエラーが出ました。 > LNK2019: 未解決の外部シンボル "void __cdecl test(void)" が関数 _main で参照されました VisualC++で「既存項目の追加」という項目より、 実体の定義されたdefine.cppをプロジェクトに追加していないため 当然といえば当然なのですが・・・ C言語でいうところの<stdio.h>等みたいに、 わざわざプロジェクトにCPPファイルを追加しなくても 関数を呼び出せるようには出来ないのでしょうか? 全ての関数と処理をヘッダーファイルに記述すると解決ですが 物凄く見辛いのでそれは避けたいのです。 また、色々なPC間で使っているため(学校のPCなので)、 ツール自体のプロパティを弄らない方法があるのでしたら、 多少面倒でもそちらの方が好ましいです。 追加する方法があるかどうか、 あればその方法をご存じでしたら教えていただければ嬉しいです。 よろしくお願いします。

  • 複数ファイルから同じ関数の呼び出しできますか?

    今、クライアント・サーバーのプログラムを作っているのですが、クライアントとサーバの間の通信を暗号化しようとしています。 開発環境はVisualStudio2010のMFCを使っています。 サーバとクライアントのプログラムとを同一のプロジェクトにして、サーバとクライアントの起動をオプションで切り分けています。 しかし暗号モジュールは一つのファイルなので、これをp1.cppとしましょう。 サーバのファイルをmain.cpp クライアントをsub.cpp として、main.cppの方で#include "p1.cpp"とやっても、クライアントのソースからは関数が参照できません。 例えば g++ main.cpp sub.cpp として、両方に同じ関数を書くと2重定義になります。 クライアントのsub.cpp にも同じようにインクルードしてやると、再定義されてるとリンクエラーが出ます。どうすれば同じ関数を同一プロジェクト内で共有(他のファイルから参照)させることができますでしょうか? 解決法をよろしくお願いします。