如何在linux環境下配置pro*c程序預編譯參數
操作系統:
紅帽子Linux 2.4.21-4.EL
資料庫:oracle10g
配置步驟:
1,在$HOME下建立一個etc目錄,在此目錄下簡歷一個配置文件Make.defines文件,編輯該文件,寫入以下內容:
include $(ORACLE_HOME)/precomp/lib/env_precomp.mk
PROC=proc
GCC=gcc
BINDIR=$(HOME)/bin
#oracle的include目錄
ORAIFLAG=-I$(ORACLE_HOME)/rdbms/public -I$(ORACLE_HOME)/rdbms/demo -I$(ORACLE_HOME)/precomp/public -I$(ORACLE_HOME)/plsql/public
#oracle的庫文件路徑
ORALFLAG=-L$(ORACLE_HOME)/lib -L$(ORACLE_HOME)/precomp/lib -L$(ORACLE_HOME)/rdbms/lib -L$(ORACLE_HOME)/sqlplus/lib -L$(ORACLE_HOME)/network/lib -L$(ORACLE_HOME)/plsql/lib
IFLAG=-I$(HOME)/include $(ORAIFLAG)
LFLAG=-L$(HOME)/lib $(ORALFLAG) -lclntsh
PROCFLAGS=char_map=string
.SUFFIXES: .pc .c .o
.pc.c:
$(PROC) $(PROCFLAGS) iname=$*
rm *.lis
.pc.o:
$(PROC) $(PROCFLAGS) iname=$*
rm *.lis
$(GCC) $(IFLAG) -c $*.c
.c.o:
$(GCC) $(IFLAG) -c $*.c
2,確保.bash_profile文件中有如下環境變數配置:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib
3,在自己的makefile文件中第一行寫入如下語句:
include $(HOME)/etc/Make.defines
其他的makefile書寫方式不變。
例子:
我有一個源程序test.pc,我的makefile文件內容如下:
include $(HOME)/etc/Make.defines
all:test
test:test.o
$(GCC) $? -o $@ $(LFLAG)
rm ./tp* ./*.c ./*.o
編譯時執行:make test
產生test可執行程序。
作者註:以上配置方法跟作者的的程序組織習慣有關(一般將通用的編譯參數放在一個文件中,具體的makefile文件再將這個定義包含進去)。總之在makefile文件內將以上提到的語句均寫入即可。
2. 誰給我講講CFLAGS的相關知識啊!(Linux Makefile)
CFLAGS主要是指makefile中的隱式規則里會用到的常見預定義變數,是C編譯器的選項,相關的你可以網路一些,我順便再給你一張插圖

3. CFLAGS變數
:= 就是來簡單的賦值, 比如源
foo := $(bar)
將bar的值賦給foo
?= 是條件賦值, 比如
foo ?= $(bar)
只有當foo變數還沒有被定義的時候,才會將bar的值賦給foo。 注意,如果foo已經被定義過,但是是空值了話,?=不會給他賦值。比方說你的makefile是
foo = hello
foo ?= new
則最終foo的值是hello
如果你的makefile是
foo =
foo ?= new
foo的值是空
請參考
4. 怎麼在linux 安裝 libpng cflags=
這幾個符號是libz庫中的,安裝zlib1g-dev就可以了(或者查一下你的系統中libz在哪個包中)
5. 如何在configure時,將編譯參數傳入,改變默認的編譯器gcc成arm
按照INSTALL中的介紹,也是常用的方法,在configure的時候,加上–host=arm-linux,結果沒有實現我們要的效果,沒有將編譯器從默認的
gcc改成arm-linux-gcc,編譯器還是用的默認的gcc:
[crifan@localhost lrzsz-0.12.20]$ CFLAGS=-O2 ./configure –host=arm-linux
loading cache ./config.cache
………………..
checking for gcc… (cached) gcc
checking whether the C compiler (gcc -O2 ) works… yes
checking whether the C compiler (gcc -O2 ) is a cross-compiler… no
………………..
後來經過多次嘗試,最後受默認的
CFLAGS=-O2 ./configure
進行配置所啟發,想到,是否可以將CC參數傳入到configure中,
結果證實,如果沒有自己的cache-file,即時加了對的CC參數,也還是無法傳入:
[crifan@localhost lrzsz-0.12.20]$ CFLAGS=-O2 CC=arm-linux-gcc ./configure –host=arm-linux
loading cache ./config.cache
………………..
checking for gcc… (cached) gcc
checking whether the C compiler (gcc -O2 ) works… yes
checking whether the C compiler (gcc -O2 ) is a cross-compiler… no
checking whether we are using GNU C… (cached) yes
………………..
而且,如果CC參數放在configure後面:
./configure CC=arm-linux-gcc
則不能識別:
[crifan@localhost lrzsz-0.12.20]$ CFLAGS=-O2 ./configure CC=arm-linux-gcc
configure: warning: CC=arm-linux-gcc: invalid host type
………………..
參數傳遞必須像
CFLAGS=-O2 ./configure
一樣,將參數設置放在configure的前面:
CC=arm-linux-gcc./configure
才能識別的。
必須要自己制定自己的cache-file 然後用./configure進行新配置,加上CC參數,才會即時生效,編譯器才可以變成我們要的arm-linux-gcc:
[crifan@localhost lrzsz-0.12.20]$ CC=arm-linux-gcc ./configure –cache-file=cache_file_0 –prefix=/usr/crifan/lrzsz
………………..
checking for gcc… arm-linux-gcc
checking whether the C compiler (arm-linux-gcc ) works… yes
checking whether the C compiler (arm-linux-gcc ) is a cross-compiler… yes
checking whether we are using GNU C… yes
………………..
否則,就無法將我們的CC參數傳入了:
[crifan@localhost lrzsz-0.12.20]$ CC=arm-linux-gcc ./configure –prefix=/usr/crifan/lrzsz
………………..
checking for gcc… (cached) gcc
checking whether the C compiler (gcc ) works… yes
checking whether the C compiler (gcc ) is a cross-compiler… no
checking whether we are using GNU C… (cached) yes
………………..
[crifan@localhost lrzsz-0.12.20]$ CFLAGS=-O2 CC=arm-linux-gcc ./configure –cache-file=cache_file_0
loading cache cache_file_0
………………..
checking for gcc… arm-linux-gcc
checking whether the C compiler (arm-linux-gcc -O2 ) works… yes
checking whether the C compiler (arm-linux-gcc -O2 ) is a cross-compiler… yes
checking whether we are using GNU C… yes
最好此處在加上–prefix=/usr/crifan/lrzsz,表示具體安裝到哪裡
[crifan@localhost lrzsz-0.12.20]$ CFLAGS=-O2 CC=arm-linux-gcc ./configure –cache-file=cache_file_0 –prefix=/usr/crifan/lrzsz
loading cache cache_file_0
………………..
checking for gcc… arm-linux-gcc
checking whether the C compiler (arm-linux-gcc -O2 ) works… yes
checking whether the C compiler (arm-linux-gcc -O2 ) is a cross-compiler… yes
checking whether we are using GNU C… yes
………………..
其中,/usr/crifan/lrzsz是已經建立好的,已經存在的文件夾,上面這樣表示編譯後,
將生成的可執行文件安裝拷貝到那個目錄.
6. linux Makefile問題.S.s: $(CPP) $(CFLAGS) $< -o $*.s什麼意思
請慢慢看,真要詳細講起來,文字實在太多了,但是由於時間原因,我只能以粗略的文字講,語言有一些邏輯漏洞,請見諒。
首先我會以粗略的文字回答你的其中一個問題,然後後面會給出第二個問題的答案。
問:什麼時候會執行這些規則及其相對應的命令?
答:當你給make命令指定了它要生成的終極目標時,它會從要生成的終極目標定址依賴的依賴條件,然後依賴條件一級一級的查找並執行相對應的命令。即如果當有目標需要.s、.o這些依賴條件的時候,會取找要生成.s、.o目標的依賴條件,這個時候就會執行這些規則:
.S.s:
$(CPP) $(CFLAGS) $< -o $*.s
.S.o:
$(CC) $(CFLAGS) -c $< -o $*.o
.c.o:
$(CC) $(CFLAGS) -c $< -o $*.o
一、
源代碼文件必須經過:預處理(cpp)、編譯(ccl)、匯編(as)、鏈接(ld)。這四個階段最終才得到可執行的程序:
makefile里定義了變數CPP=cpp;其中$(CPP)的意思是去定義變數CPP里的值:cpp,用cpp來預處理源文件。
$(CFLAGS)的意思是取定義變數CDLAGS裡面的值,一般是一些自我定義的預處理命令和編譯命令的參數。
$<的意思是:在規則的命令中,表示第一個依賴條件
-o是一個預處理、編譯等執行命令需要的參數
/*
其實這條命令:$(CPP) $(CFLAGS) $< -o $*.s,就是一條預處理命令,將一個源文件預處理為.s文件後綴的文件,*為通配符。那源文件在哪裡呢。其實這條命令.S.s: 已經說了以.S結尾的文件就是源文件。那這條命令.S.s這么說了呢?請看下面的後綴規則講解。
*/
二、
老式風格的"後綴規則"
後綴規則是一個比較老式的定義隱含規則的方法。後綴規則會被模式規則逐步地取代。因為模式規則更強更清晰。為了和老版本的Makefile兼容,GNU make同樣兼容於這些東西。後綴規則有兩種方式:"雙後綴"和"單後綴"。
雙後綴規則定義了一對後綴:目標文件的後綴和依賴目標(源文件)的後綴。如".c.o"相當於"%o : %c"。單後綴規則只定義一個後綴,也就是源文件的後綴。
後綴規則中所定義的後綴應該是make所認識的,如果一個後綴是make所認識的,那麼這個規則就是單後綴規則,而如果兩個連在一起的後綴都被make所認識,那就是雙後綴規則。例如:".c"和".o"都是make所知道。
因而,如果你定義了一個規則是".c.o"那麼其就是雙後綴規則,意義就是".c" 是源文件的後綴,".o"是目標文件的後綴。如下示例:
.c.o:
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
其中.c.o:這個命令表示源文件的後綴為.c,目標文件的後綴為.o;即也可理解為:生成.o的目標文件依賴條件是源文件.c
下面命令是將是所有的.c源文件都編譯成.o的目標文件。
註:後綴規則不允許任何的依賴文件,如果有依賴文件的話,那就不是後綴規則,那些後綴統統被認為是文件名,
如:
.c.o: foo.h
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
這個例子,就是說,文件".c.o"依賴於文件"foo.h",而不是我們想要的這樣:
%.o: %.c foo.h
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
因此後綴規則不允許任何的依賴文件。
7. makefile的選項CFLAGS,CPPFLAGS,LDFLAGS和LIBS的區別
看看如下選項:
LDFLAGS = -L/var/xxx/lib -L/opt/MySQL/lib
LIBS = -lmysqlclient -liconv
這就明白了。LDFLAGS告訴鏈接器從哪裡尋找庫文件,LIBS告訴鏈接器要鏈接哪些庫文件。不過使用時鏈接階段這兩個參數都會加上,所以你即使將這兩個的值互換,也沒有問題。
說到這里,進一步說說LDFLAGS指定-L雖然能讓鏈接器找到庫進行鏈接,但是運行時鏈接器卻找不到這個庫,如果要讓軟體運行時庫文件的路徑也得到擴展,那麼我們需要增加這兩個庫給"-Wl,R"
LDFLAGS = -L/var/xxx/lib -L/opt/mysql/lib -Wl,R/var/xxx/lib -Wl,R/opt/mysql/lib
如 果在執行./configure以前設置環境變數export LDFLAGS="-L/var/xxx/lib
-L/opt/mysql/lib -Wl,R/var/xxx/lib -Wl,R/opt/mysql/lib"
,注意設置環境變數等號兩邊不可以有空格,而且要加上引號哦(shell的用法)。那麼執行configure以後,Makefile將會設置這個選項,
鏈接時會有這個參數,編譯出來的可執行程序的庫文件搜索路徑就得到擴展了。
PS:-Wl,R在GraphicsMagick環境下,用為-R, 也就是LDFLAGS = -L/var/xxx/lib -R/var/xxx/lib
CFLAGS 或 CPPFLAGS的用法
CPPFLAGS='-I/usr/local/libjpeg/include -I/usr/local/libpng/include'
8. Linux里安裝文件設置CFLAGS以後就不能安裝了
你知道 CFLAGS 是幹啥用的嗎?