参考

個人で使用する場合

template

simple

PREFIX=/opt
# mysql
MySQL_INC   = -I/usr/include/mysql

#mysqlpp
MySQLpp     = ${PREFIX}/mysql++
MySQLpp_INC = -I${MySQLpp}/include/mysql++
MySQLpp_LIB = -L${MySQLpp}/lib -lmysqlpp

# boost
BOOST_DIR = ${PREFIX}/boost
BOOST_INC = -I${BOOST_DIR}/include

# flags
CPPFLAGS   += -I./
CPPFLAGS   += ${MySQL_INC}
CPPFLAGS   += ${MySQLpp_INC}
CPPFLAGS   += ${BOOST_INC}
LDFLAGS    += ${MySQLpp_LIB}
########
CXX = g++
LD  = ${CXX}
CXXFLAGS += -Wall
########
test  = test
testS = test.cc
testO = ${testS:.cc=.o}
########
all: ${test}
########
%.o: %.cc
	${CXX} ${CXXFLAGS} -o $@  -c $< ${CPPFLAGS}
${test}: ${testO}
	${LD} -o $@ $^ ${LDFLAGS}
########
.PHONY: clean
clean:
	rm -rf *.o ${all}
distclean: clean
	rm -rf *~

Some command line options

-f filenameMakefile以外でのmakeの実行。
-n実行されるコマンドの表示。実際には実行されない。
-kエラーが起きても作業を継続しようとする。
-w作業を行なう前に、作業ディレクトリを表示する。

Some influential enviroment variables

CCC compiler command
CXXC++ compiler command
CFLAGSC compiler flags
CXXFLAGSC++ compiler flags
LDFLAGSlinker flags, e.g. -L<lib_dir> if you have libraries in a nonstandard directory <lib_dir>.
CPPFLAGSC/C++ preprocessor flags, -I<include_dir> if you have header in a nonstandard directory <header_lib>.
CPPC preprocessor
F77Fortran 77 compiler command
FFLAGSFortran 77 compiler flags

Some variables

$@
ターゲットファイル名 よく使う
$^
すべての依存するファイルの名前 よく使う
$%
ターゲットがアーカイブメンバだったときのターゲットメンバ名
$<
最初の依存するファイルの名前
$?
ターゲットより新しいすべての依存するファイル名
$+
Makefileと同じ順番の依存するファイルの名前
$*
サフィックスを除いたターゲットの名前

改行

バックスラッシュ「\」で改行を無視することができる:

name = \
hoge.o \
hogehoge.o \

静的ライブラリのリンク時にundefined referenceエラーが出る

gccでリンク時にundefined referenceエラーが出る場合がある。 通常はオブジェクトやライブラリの指定忘れが原因であるが、 静的ライブラリをリンクする順番に間違いがあって出る場合もある。

例えば foo.o が静的ライブラリ libfoo.a 内の関数を使用している、 つまり

foo.o → libfoo.a

という依存関係があるとき、

g++ -o foo libfoo.a foo.o

とするとundefined referenceエラーが出る。

従って

g++ -o foo foo.o libfoo.a

と先にfoo.oを書かなくてはいけない。

パッケージ利用の場合

手動バージョン管理

makeは

/home/usrname/make

で行い、バージョンごとに

/home/usrname/opt/pkgs/

にインストールする。そして、

/home/usrname/opt/

以下に適当なリンクを張る。 例えば、make以下でhoge-1.1.1を作成した場合、

/home/usrname/opt/pkgs/hoge-1.1.1

にインストールし、

/home/usrname/opt/hoge

にリンクを張る。バージョンを変える場合は、 同じようにmakeし、最後にリンク先を変更すれば良い。

compile

simple ver.

hoge_v1.2.3.tar.gzのようなパッケージは、 大抵

tar zxvf hoge_v1.2.3.tar.gz
ls
 hoge hoge_v1.2.3.tar.gz
cd hoge
./configure
make
make install

でO.K.

実用的には、インストールする場所、バージョン管理、 オプション設定、最適化等をする場合が多い。

./configure

--help
help表示(filepythonの例)。 moreやlessにパイプするべし。
--prefix=/home/usrname/opt/pkgs/hoge_v1.2.3
インストール先を指定。例えばライブラリなどの場合「--prefix」で指定したディレクトリ以下に、「lib」「share」「include」「bin」等がコピーされる。
--enable-hoge
hogeを有効化してコンパイル。例えばrootの場合「--enable-minuit2」でMinuit2をサポート。例えばPythonの場合「--enable-shared」でshared library作成。場合によっては別オプションでパスの指定が必要になる場合も。

make and install

make
make install

test

よくあるターゲット:

make test

or

make tests

or

make check

or

make checks

clean and distclean

お掃除:(一部)

make clean

完全

make distclean

Errors

静的ライブラリのリンク時にundefined referenceエラーが出る

gccでリンク時にundefined referenceエラーが出る場合がある。 通常はオブジェクトやライブラリの指定忘れが原因であるが、 静的ライブラリをリンクする順番に間違いがあって出る場合もある。

例えば foo.o が静的ライブラリ libfoo.a 内の関数を使用している、 つまり

foo.o → libfoo.a

という依存関係があるとき、

g++ -o foo libfoo.a foo.o

とするとundefined referenceエラーが出る。

従って

g++ -o foo foo.o libfoo.a

と先にfoo.oを書かなくてはいけない。

添付ファイル: filehelp.txt 828件 [詳細]