本文轉自http://blog.csdn.net/fengbingchun/article/details/17994489
Ubuntu環境:14.04
首先創建一個test_makefile_gcc文件夾,此test_makefile_gcc文件夾下包括:src文件夾用於存放源文件; include文件夾用於存放頭文件;bin文件夾用於存放生成的動態庫.so文件;lib文件夾用於存放生成的靜態庫.a文件;project_makefile文件夾存放此工程的makefile文件;test文件夾存放用來測試靜態庫和動態庫的源文件;另外在test_makefile_gcc文件夾下還包含一個makefile文件。 include文件夾下包括add.h、divide.h、hybrid.h、multiply.h、subtract.h;src文件夾下包括add.c、divide.cpp、hybrid.cpp、multiply.cpp、subtract.c。
add.h文件:
1 int CalAdd(int a, int b);
divide.h文件
1 int CalDivide(int a, int b);
hybrid.h文件
1 int CalHybrid(int a, int b, int c, int d);
multiply.h文件
1 int CalMultiply(int a, int b);
subtract.h文件
1 int CalSubtract(int a, int b);
add.c文件
1 #include "add.h" 2 3 int CalAdd(int a, int b) 4 { 5 return a + b; 6 }
divide.cpp文件
1 #include "divide.h" 2 3 int CalDivide(int a, int b) 4 { 5 return a / b; 6 }
hybrid.cpp文件
#include "hybrid.h" extern "C" { #include "add.h" #include "subtract.h" } #include "multiply.h" #include "divide.h" int CalHybrid(int a, int b, int c, int d) { int tmp1=0, tmp2=0, tmp3=0, tmp4=0, result=0; tmp1 = CalDivide(a, b); tmp2 = CalMultiply(c, d); tmp3 = CalAdd(tmp1, tmp2); tmp4 = CalSubtract(tmp2, tmp1); result = CalAdd(tmp3, tmp4); return result; }
multiply.cpp文件
1 #include "multiply.h" 2 3 int CalMultiply(int a, int b) 4 { 5 return a * b; 6 }
subtract.c 文件
#include "subtract.h" int CalSubtract(int a, int b) { return a - b; }
接下來就是寫makefile文件的內容。
project_makefile文件夾中makefile內容為:
1 add_cflags = -I../include 2 3 cxxsources = \ 4 5 ../src/divide.cpp \ 6 7 ../src/multiply.cpp \ 8 9 ../src/hybrid.cpp 10 11 csources = \ 12 13 ../src/add.c \ 14 15 ../src/subtract.c 16 17 sources = $(cxxsources) $(csources) 18 19 include ../makefile
注意../src/hybrid.cpp 和../src/subtract.c 后面一定要有一個空格符。
test_makefile_gcc文件夾中的makefile文件內容為:
1 debug: $(sources) 2 3 gcc -c -fPIC -ggdb $(add_cflags) $(sources) 4 5 release: $(sources) 6 7 gcc -c -Os -fPIC $(add_cflags) $(sources)
test文件夾中test_makefile_gcc.cpp文件的內容為:
1 #include "../include/hybrid.h" 2 3 #include <iostream> 4 using namespace std; 5 6 int main(int argc, char* argv[]) 7 8 { 9 int a=10, b=200, c=-34, d=92; 10 11 int result = CalHybrid(a, b, c, d); 12 13 cout<<result<<endl; 14 15 return 0; 16 17 }
詳細操作步驟:
1、將終端定位到project_makefile文件夾下,執行命令: make debug ;在project_makefile文件夾下生成add.o、divide.o、hybrid.o、multiply.o、subtract.o文件;
2、在lib文件夾下生成靜態庫libtest[linux_dbg_32].a,執行命令:ar -r ../lib/libtest[linux_dbg_32].a *.o ;
3、將終端定位到test文件夾,執行命令:g++ -o test test_makefile_gcc.cpp -L ../lib -ltest[linux_dbg_32] ,生成test執行文件;
4、執行命令:./test ,輸出結果:-6256,Debug靜態庫的調用完成;
5、將終端重新定位到project_makefile文件夾下,執行命令:gcc -shared -o ../bin/libtest[linux_dbg_32].so *.o ,在bin文件夾下生成libtest[linux_dbg_32].so ;
6、執行命令:g++ -o ../test/test2 ../test/test_makefile_gcc.cpp -L ../bin -ltest[linux_dbg_32] ,在test文件夾下生成test2執行文件;
7、執行命令:export LD_LIBRARY_PATH=/home/spring/test_makefile_gcc/bin ,用於指定文件需調用的動態庫的路徑;
8、執行命令:./test2 ,輸出結果:-6256,Debug動態庫的調用完成;
9、若生成Release的動態庫或靜態庫,執行 make release,其它步驟僅需修改生成的文件名即可。