使用Makefile連結so庫檔案
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
初學Makefile,權當是筆記,希望對別人有些幫助吧。
------------------------------------------------------------------------------------
本次例子目錄結構如下:
目錄說明:
lib目錄是我自己寫的一個so庫檔案,名為libA.so,很簡單,裡面的內容截圖如下:
-------------------------------------------------------------------------------------------------------------
main目錄是測試程式所在目錄,用於測試libA.so,裡面的內容截圖如下:
---------------------------------------------------------------------------------------------------------------------
release目錄用於存放編譯後的so庫檔案和編譯後的測試程式,截圖如下:
-----------------------------------------------------------------------------------------------------------------------
因為main.out用於測試libA.so,所以編譯時我們必須先編譯libA.so,
libA.so的Makefile內容如下:
exe=../release/libA.so### 連結目標檔案$(exe):libA.o gcc -o $(exe) -lstdc++ -fPIC -shared -Xlinker libA.o ### 編譯原始檔libA.o:libA.cpp gcc -lstdc++ -c libA.cpp clean: -rm *.out *.o *.bak
---------------------------------------------------------------------------------------------------------------------------------------
libA.cpp內容如下:
#include <stdio.h>void ShowHello(){ printf("hello libA \n");}
----------------------------------------------------------------------------------------
main.cpp的Makefile內容如下:
exe=../release/main.out### 連結目標檔案### -L ../release 用於指定libA.so所在目錄### -lA 連結庫檔案libA.so$(exe):main.o gcc -o $(exe) -lstdc++ -Xlinker main.o -L ../release -lA ### 編譯原始檔main.o:main.cpp gcc -lstdc++ -c main.cpp clean: -rm *.out *.o *.bak
--------------------------------------------------------------------------------------------------------------
main.cpp內容如下:
#include<stdio.h>extern void ShowHello();int main(void){ ShowHello(); return 0;}
--------------------------------------------------------------------------------
編譯好libA.cpp和main.cpp,跳到release執行main.out,效果如下:
-----------------------------------------------------------------------------------------------------------------------------------------------------
題外話:
執行程式如果提示找不到xxx.so,
敲以下命令即可:
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH // 把當前目錄加入到庫檔案搜尋目錄環境變數
我當時的錯誤提示如下:
./main.out
./main.out: error while loading shared libraries: libA.so: cannot open shared object file: No such file or directory