日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux复制duo文件,自动生成Linux下Makefile全攻略(转)

發布時間:2025/3/12 linux 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux复制duo文件,自动生成Linux下Makefile全攻略(转) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

下面再來看看多個源文件的例子。

如何寫用code1.c, code2.c生成 prog1的configure.in和Makefile.am。首先建立一個項目文件夾testproj。在testproj下建立dir1目錄。

[kang@node16 kang]$ mkdir testproj

[kang@node16 kang]$ mkdir dir1

然后在dir1目錄中分別建立code1.c, code1.h, code2.c, code2.h,下面源代碼都只由幾個簡單的語句組成,以便說明問題。

下面是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的入口點:#include "code1.h"

#include "code2.h"

void foo_b()

{

printf("This is code2.\n");

}

int main()

{

foo_a();

foo_b();

}

建立好這幾個文件之后,下面就可以正式建立configure.in和Makefile.am了。

首先在testproj目錄下建立configure.in文件:#指定項目的一個源文件

AC_INIT(dir1/code2.c)

#指定項目名稱和版本號

AM_INIT_AUTOMAKE(prog1, 0.0.1)

#檢查編譯器

AC_PROG_CC

#輸出Makefile文件

AC_OUTPUT(Makefile dir1/Makefile)

同時建立testproj目錄下的Makefile.am文件,這個文件很簡單,就一句話:

SUBDIRS=dir1

然后建立dir1目錄下的Makefile.am文件,這才是真正起作用的Makefile.am文件:

bin_PROGRAMS=prog1

prog1_SOURCES=code1.c code2.c

完成之后,為了方便操作,再寫一個autogen.sh文件,保存在testproj目錄下。

#!/bin/sh

aclocal

automake --add-missing

autoconf

./autogen.sh即可在testproj目錄下生成configure和makefile文件,同時在dir1目錄下也會生成一個makefile文件。現在在testproj目錄下執行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'

進入dir1目錄,就可以看到生成的prog1程序。如果再執行make install,prog1將被安裝到缺省的/usr/local/bin目錄下去。

這就是一個最簡單的configure.in和Makefile.am的編寫情況。你如果不熟悉,最好自己動手做一遍,復雜的configure.in和Makefile.am都是在這個基礎上擴充的。

在此基礎上,如果要同時實現code1.c, code2.c生成 prog1, 而 code3.c生成prog2。由于code1.c,code2.c,code3.c都在同一個目錄,只要改寫dir1目錄下的Makefile.am就可以了。

為了便于說明問題,首先要在dir1目錄下增加一個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

再重新執行一次autogen.sh。make之后,在dir1目錄下就會同時存在prog1和prog2兩個程序。

那么,兩個處在不同子目錄下的文件如何共同生成一可執行文件呢?一般互相引用的源程序都是放在同一個目錄下的,如果要放在不同的目錄,可以把要引用的源文件編譯成靜態庫文件。為便于說明問題,準備了如下文件:

在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文件。#指定項目的一個源文件

AC_INIT(dir2/code4.c)

#指定項目名稱和版本號

AM_INIT_AUTOMAKE(myproject, 0.0.1)

#檢查編譯器

AC_PROG_CC

#檢查ranlib

AC_PROG_RANLIB

#輸出Makefile文件

AC_OUTPUT(Makefile dir1/Makefile dir2/Makefile)

同時修改testproj目錄下的Makefile.am文件。

SUBDIRS = dir1 dir2

在dir1目錄下修改Makefile.am文件。這時是將code1.c編譯成一個不安裝(noinst)的靜態庫文件。noinst_LIBRARIES=libcode1.a

libcode1_a_SOURCES=code1.c

在dir2目錄下添加一個Makefile.am文件。INCLUDES= -I../dir1

bin_PROGRAMS=prog4

prog4_SOURCES=code4.c

prog4_LDADD=../dir1/libcode1.a

然后執行autogen.sh就可以了。

補充問答。

問題1:如何指定特定的編譯器(AC_PROG_CC只會檢查C編譯器?)?

答:首先在configure.in中加上對特殊編譯器的檢查,如果檢查不到,則configure時會停止并給出“Couldn't find mpicc.”的出錯信息:#檢查mpicc編譯器

AC_CHECK_PROG(MPICC,mpicc,yes,no)

if test "$MPICC" = no; then

AC_MSG_ERROR([Couldn't find mpicc.])

fi

然后把需要用mpicc編譯的源程序放在一個目錄下面。在這個目錄中先用上面的方法寫Makefile.am文件。然后再加上下面這部分:

CC=mipcc

CFLAGS=

這樣用自己定義的編譯器和編譯標志取代系統定義的編譯器和編譯標志。

問題2:因為有部分程序不能公開發布,所以我想將它們生成庫,(*.la, 通過libtool 生成),但我解開生成的壓縮文件,發現庫文件沒在壓縮文件里面,所以make的時候會有些函數找不到,產生錯誤。請問如何能讓帶庫文件的文件夾也一起包括 的壓縮文件里去呢?

答:如果代碼中用了庫文件,要先編譯安裝庫文件,再編譯代碼。你可以把編譯成庫文件的代碼獨立出來單獨打包,這樣也便于管理。前面給的例子中庫文件是只編譯不安裝的。下面給一個動態庫安裝的例子。

問題3:我做的Makefile安裝時默認安裝在/usr/local/bin底下,而我想安裝在/usr/sbin下,不知道該怎么改?

答:這個問題不需要修改configure.in或者Makefile.am文件。用./configure --help可以看到有一個bindir參數可以指定可執行文件的安裝目錄。你只需要執行./configure --bindir=/usr/sbin就可以了。

總結

以上是生活随笔為你收集整理的linux复制duo文件,自动生成Linux下Makefile全攻略(转)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。