linux复制duo文件,自动生成Linux下Makefile全攻略(转)
下面再來(lái)看看多個(gè)源文件的例子。
如何寫(xiě)用code1.c, code2.c生成 prog1的configure.in和Makefile.am。首先建立一個(gè)項(xiàng)目文件夾testproj。在testproj下建立dir1目錄。
[kang@node16 kang]$ mkdir testproj
[kang@node16 kang]$ mkdir dir1
然后在dir1目錄中分別建立code1.c, code1.h, code2.c, code2.h,下面源代碼都只由幾個(gè)簡(jiǎn)單的語(yǔ)句組成,以便說(shuō)明問(wèn)題。
下面是code1.h:#include
void foo_a();
下面是code1.c:#include "code1.h"
void foo_a()
{
printf("This is code1.\n");
}
下面是code2.h:#include
void foo_b();
下面是code2.c,這里讓code.c作為prog1的入口點(diǎn):#include "code1.h"
#include "code2.h"
void foo_b()
{
printf("This is code2.\n");
}
int main()
{
foo_a();
foo_b();
}
建立好這幾個(gè)文件之后,下面就可以正式建立configure.in和Makefile.am了。
首先在testproj目錄下建立configure.in文件:#指定項(xiàng)目的一個(gè)源文件
AC_INIT(dir1/code2.c)
#指定項(xiàng)目名稱和版本號(hào)
AM_INIT_AUTOMAKE(prog1, 0.0.1)
#檢查編譯器
AC_PROG_CC
#輸出Makefile文件
AC_OUTPUT(Makefile dir1/Makefile)
同時(shí)建立testproj目錄下的Makefile.am文件,這個(gè)文件很簡(jiǎn)單,就一句話:
SUBDIRS=dir1
然后建立dir1目錄下的Makefile.am文件,這才是真正起作用的Makefile.am文件:
bin_PROGRAMS=prog1
prog1_SOURCES=code1.c code2.c
完成之后,為了方便操作,再寫(xiě)一個(gè)autogen.sh文件,保存在testproj目錄下。
#!/bin/sh
aclocal
automake --add-missing
autoconf
./autogen.sh即可在testproj目錄下生成configure和makefile文件,同時(shí)在dir1目錄下也會(huì)生成一個(gè)makefile文件。現(xiàn)在在testproj目錄下執(zhí)行make,屏幕將顯示如下信息:
[kang@node16 testproj]$ make
Making all in dir1
make[1]: Entering directory `/home/kang/testproj/dir1'
gcc -DPACKAGE=\"prog1\" -DVERSION=\"0.0.1\" -I. -I.????? -g -O2 -c code1.c
code1.c:6:2: warning: no newline at end of file
gcc -DPACKAGE=\"prog1\" -DVERSION=\"0.0.1\" -I. -I.????? -g -O2 -c code2.c
code2.c:13:2: warning: no newline at end of file
gcc -g -O2 -o prog1 code1.o code2.o
make[1]: Leaving directory `/home/kang/testproj/dir1'
make[1]: Entering directory `/home/kang/testproj'
make[1]: Nothing to be done for `all-am'.
make[1]: Leaving directory `/home/kang/testproj'
進(jìn)入dir1目錄,就可以看到生成的prog1程序。如果再執(zhí)行make install,prog1將被安裝到缺省的/usr/local/bin目錄下去。
這就是一個(gè)最簡(jiǎn)單的configure.in和Makefile.am的編寫(xiě)情況。你如果不熟悉,最好自己動(dòng)手做一遍,復(fù)雜的configure.in和Makefile.am都是在這個(gè)基礎(chǔ)上擴(kuò)充的。
在此基礎(chǔ)上,如果要同時(shí)實(shí)現(xiàn)code1.c, code2.c生成 prog1, 而 code3.c生成prog2。由于code1.c,code2.c,code3.c都在同一個(gè)目錄,只要改寫(xiě)dir1目錄下的Makefile.am就可以了。
為了便于說(shuō)明問(wèn)題,首先要在dir1目錄下增加一個(gè)code3.h 和code3.c文件。
下面是code3.h:#include
void foo_c();
下面是code3.c:#include "code3.h"
void foo_c()
{
printf("This is code3.\n");
}
int main()
{
foo_c();
}
然后修改dir1目錄下的Makefile.am文件:
bin_PROGRAMS=prog1 prog2
prog1_SOURCES=code1.c code2.cprog2_SOURCES=code3.c
再重新執(zhí)行一次autogen.sh。make之后,在dir1目錄下就會(huì)同時(shí)存在prog1和prog2兩個(gè)程序。
那么,兩個(gè)處在不同子目錄下的文件如何共同生成一可執(zhí)行文件呢?一般互相引用的源程序都是放在同一個(gè)目錄下的,如果要放在不同的目錄,可以把要引用的源文件編譯成靜態(tài)庫(kù)文件。為便于說(shuō)明問(wèn)題,準(zhǔn)備了如下文件:
在testproj目錄下新建dir2目錄,保存code4.h和code4.c文件。
下面是code4.h:#include
void foo_d();
下面是code4.c:#include "code1.h"
#include "code4.h"
void foo_d()
{
printf("This is code4.\n");
}
int main()
{
foo_a();
foo_d();
}
修改testproj目錄下的configure.in文件。#指定項(xiàng)目的一個(gè)源文件
AC_INIT(dir2/code4.c)
#指定項(xiàng)目名稱和版本號(hào)
AM_INIT_AUTOMAKE(myproject, 0.0.1)
#檢查編譯器
AC_PROG_CC
#檢查ranlib
AC_PROG_RANLIB
#輸出Makefile文件
AC_OUTPUT(Makefile dir1/Makefile dir2/Makefile)
同時(shí)修改testproj目錄下的Makefile.am文件。
SUBDIRS = dir1 dir2
在dir1目錄下修改Makefile.am文件。這時(shí)是將code1.c編譯成一個(gè)不安裝(noinst)的靜態(tài)庫(kù)文件。noinst_LIBRARIES=libcode1.a
libcode1_a_SOURCES=code1.c
在dir2目錄下添加一個(gè)Makefile.am文件。INCLUDES= -I../dir1
bin_PROGRAMS=prog4
prog4_SOURCES=code4.c
prog4_LDADD=../dir1/libcode1.a
然后執(zhí)行autogen.sh就可以了。
補(bǔ)充問(wèn)答。
問(wèn)題1:如何指定特定的編譯器(AC_PROG_CC只會(huì)檢查C編譯器?)?
答:首先在configure.in中加上對(duì)特殊編譯器的檢查,如果檢查不到,則configure時(shí)會(huì)停止并給出“Couldn't find mpicc.”的出錯(cuò)信息:#檢查mpicc編譯器
AC_CHECK_PROG(MPICC,mpicc,yes,no)
if test "$MPICC" = no; then
AC_MSG_ERROR([Couldn't find mpicc.])
fi
然后把需要用mpicc編譯的源程序放在一個(gè)目錄下面。在這個(gè)目錄中先用上面的方法寫(xiě)Makefile.am文件。然后再加上下面這部分:
CC=mipcc
CFLAGS=
這樣用自己定義的編譯器和編譯標(biāo)志取代系統(tǒng)定義的編譯器和編譯標(biāo)志。
問(wèn)題2:因?yàn)橛胁糠殖绦虿荒芄_(kāi)發(fā)布,所以我想將它們生成庫(kù),(*.la, 通過(guò)libtool 生成),但我解開(kāi)生成的壓縮文件,發(fā)現(xiàn)庫(kù)文件沒(méi)在壓縮文件里面,所以make的時(shí)候會(huì)有些函數(shù)找不到,產(chǎn)生錯(cuò)誤。請(qǐng)問(wèn)如何能讓帶庫(kù)文件的文件夾也一起包括 的壓縮文件里去呢?
答:如果代碼中用了庫(kù)文件,要先編譯安裝庫(kù)文件,再編譯代碼。你可以把編譯成庫(kù)文件的代碼獨(dú)立出來(lái)單獨(dú)打包,這樣也便于管理。前面給的例子中庫(kù)文件是只編譯不安裝的。下面給一個(gè)動(dòng)態(tài)庫(kù)安裝的例子。
問(wèn)題3:我做的Makefile安裝時(shí)默認(rèn)安裝在/usr/local/bin底下,而我想安裝在/usr/sbin下,不知道該怎么改?
答:這個(gè)問(wèn)題不需要修改configure.in或者M(jìn)akefile.am文件。用./configure --help可以看到有一個(gè)bindir參數(shù)可以指定可執(zhí)行文件的安裝目錄。你只需要執(zhí)行./configure --bindir=/usr/sbin就可以了。
總結(jié)
以上是生活随笔為你收集整理的linux复制duo文件,自动生成Linux下Makefile全攻略(转)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 帮帮忙—ssm框架中,简单自定义标签Si
- 下一篇: 在Spring Boot + Mybat