編寫簡單的makefile

以編譯和運行java程序爲例,其他類型的c或c++程序都一樣的操作方式;

本文只教如何寫簡單的makefile,不講各種高深的原理,任何東西的關鍵都在於應用

先貼代碼

#以下爲makefile文件內容
mainer:mainer.java CAudioSDK.cpp CAudioSDK.h JniHelper.h
        (這前面必須是tab縮進)javac -cp /usr/java/jdk-12.0.1/lib/Java-WebSocket-1.3.0.jar mainer.java
        javac -h . -cp /usr/java/jdk-12.0.1/lib/Java-WebSocket-1.3.0.jar mainer.java
        g++ -shared -fPIC -I/usr/java/jdk-12.0.1/include -I/usr/java/jdk-12.0.1/include/linux CAudioSDK.cpp CAudioSDK.h JniHelper.h -o libAudioSDK.so

#g++ -shared -fPIC -I/usr/java/jdk-12.0.1/include -I/usr/java/jdk-12.0.1/include/linux CAudioSDK.cpp CAudioSDK.h JniHelper.h -o libAudioSDK.so
#g++ -shared -fPIC -MM CAudioSDK.cpp CAudioSDK.h JniHelper.h -o libAudioSDK.so
sdk:
        g++ -shared -fPIC -I/usr/java/jdk-12.0.1/include -I/usr/java/jdk-12.0.1/include/linux CAudioSDK.cpp CAudioSDK.h JniHelper.h -o libAudioSDK.so
        
        
clean:
        rm -rf *.log *.class *.so

#-cp /usr/java/jdk-12.0.1/lib/Java-WebSocket-1.3.0.jar
run:
        java  mainer

以下是對每句代碼的分析

mainer:mainer.java CAudioSDK.cpp CAudioSDK.h JniHelper.h

冒號之前是編譯要生成的目標程序名稱,可根據項目需要取名,我這裏取名mainer,
冒號之後判斷是否重新編譯mainer程序的依據,
如果mainer.java CAudioSDK.cpp CAudioSDK.h JniHelper.h中的任何一個文件改變了,
則在執行make的時候,會重新編譯mainer
    (這前面必須是tab縮進)javac -cp /usr/java/jdk-12.0.1/lib/Java-WebSocket-1.3.0.jar mainer.java
    javac -h . -cp /usr/java/jdk-12.0.1/lib/Java-WebSocket-1.3.0.jar mainer.java
    g++ -shared -fPIC -I/usr/java/jdk-12.0.1/include -I/usr/java/jdk-12.0.1/include/linux CAudioSDK.cpp CAudioSDK.h JniHelper.h -o libAudioSDK.so

注意到最前面的一句中文提示了麼,很關鍵,
帶有tab縮進的語句會被認爲是編譯或執行語句,
前面解釋過什麼情況下會重新編譯mainer程序,
那麼怎麼執行呢,
就是緊接着的,帶有tag縮進的語句,
可以有多行的執行語句,
我是比較懶,爲了圖方便,把所有編譯過程都執行一遍,
包括生成mainer和動態庫libAudioSDK.so,
javac 就是java的編譯命令,
-cp  /usr/java/jdk-12.0.1/lib/Java-WebSocket-1.3.0.jar 編譯過程中要關聯指定jar庫,
g++ 就是C++代碼編譯器,沒啥可說的,
-shared -fPIC 是指明以動態庫形式編譯生成,
-I/usr/java/jdk-12.0.1/include 是聲明在編譯過程中,在源文件中的某些文件或者庫的來源,比如jni.h就在該目錄下
sdk:
        g++ -shared -fPIC -I/usr/java/jdk-12.0.1/include -I/usr/java/jdk-12.0.1/include/linux CAudioSDK.cpp CAudioSDK.h JniHelper.h -o libAudioSDK.so


不說具體什麼原理,只需要知道這樣可以實現單獨執行某些命令,
比如在終端下執行 make sdk,
則會執行地下緊跟着的若干行帶tab縮進的語句,
之後的clean和run都是同樣的原理

最後總結下:

#執行 make 是執行以下語句
mainer:mainer.java CAudioSDK.cpp CAudioSDK.h JniHelper.h
        javac -cp /usr/java/jdk-12.0.1/lib/Java-WebSocket-1.3.0.jar mainer.java
        javac -h . -cp /usr/java/jdk-12.0.1/lib/Java-WebSocket-1.3.0.jar mainer.java
        g++ -shared -fPIC -I/usr/java/jdk-12.0.1/include -I/usr/java/jdk-12.0.1/include/linux CAudioSDK.cpp CAudioSDK.h JniHelper.h -o libAudioSDK.so


#執行 make sdk 是執行以下語句
sdk:
        g++ -shared -fPIC -I/usr/java/jdk-12.0.1/include -I/usr/java/jdk-12.0.1/include/linux CAudioSDK.cpp CAudioSDK.h JniHelper.h -o libAudioSDK.so


#執行 make clean 是執行以下語句        
clean:
        rm -rf *.log *.class *.so


#執行 make run 是執行以下語句
run:
        java  mainer


#各位還可以舉一反三,想怎麼操作都可以,
#千萬記住tab縮進,
#如果直接拷貝的代碼,可能被轉變成空格了,需要手動修改下

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章