makefile 生成/使用靜態庫

 

//	puls.h
int my_puls(int x,int y); 


 

//	puls.cc
int my_puls(int x,int y)
{
	return x + y;
}


 

//	puls_lib_test.cc
#include"puls.h"
#include<stdio.h>
int main()
{
	int puls_res = my_puls(3,4);
	printf("3 + 4 = %d\n",puls_res);
}


 

//	puls_lib.mak
SHELL = /bin/sh
CC = gcc
AR = ar

CFLAG = -O2 -W -Wall

INCLUDE_PATH = -I.
TEST_TARGET = ./libpuls.a
TEST_OBJ = puls.o
TEST_SRC = ./puls.cc

all : $(TEST_TARGET)
$(TEST_OBJ): $(TEST_SRC)
	$(CC) $(CFLAG) $(INCLUDE_PATH) -c $(TEST_SRC)

$(TEST_TARGET) : $(TEST_OBJ)
	$(AR) cq $@ $^

clean:
	rm -f *.o $(TEST_TARGET) 


 

//	use_puls_lib.mak
SHELL = /bin/sh
CC = gcc

INCLUDE_PATH = -I.
TEST_TARGET = ./puls_lib_test
TEST_OBJ = puls.o
TEST_SRC = ./puls_lib_test.cc
LDFLAGS := ./libpuls.a
all : 
	$(CC) -g $(TEST_SRC) $(LDFLAGS) -o $(TEST_TARGET) $(INCLUDE_PATH)
	#gcc -g ./puls_lib_test.cc ./libpuls.a -o ./lib_puls_test -I.

clean:
	rm -rf *.o $(TEST_TARGET) 


//execute restut:

lee@ubuntu:~/workspace/generate-lib$<strong> make -fpuls_lib.mak</strong>
gcc -O2 -W -Wall -I. -c ./puls.cc
ar cq libpuls.a puls.o
lee@ubuntu:~/workspace/generate-lib$ <strong>make -fuse_puls_lib.mak</strong>
gcc -g ./puls_lib_test.cc ./libpuls.a -o ./puls_lib_test -I.
#gcc -g ./puls_lib_test.cc ./libpuls.a -o ./lib_puls_test -I.
lee@ubuntu:~/workspace/generate-lib$ <strong>./puls_lib_test</strong>
3 + 4 = 7 															
 
// reference from : <a target=_blank href="http://blog.csdn.net/xiaofei0859/article/details/5745455">http://blog.csdn.net/xiaofei0859/article/details/5745455</a>
<pre class="cpp" name="code">一。靜態庫
 
創建靜態庫
 
  仍使用剛纔的hello.c和test.c。
 
  第一步,生成目標文件。
 
  gcc -c hello.c
 
  第二步,把目標文件歸檔。
 
  ar r libhello.a hello.o
 
  file libhello.a
  下面一行命令就是教你如何在程序中鏈接靜態庫的:
 
  gcc test.c -lhello -L. -static -o hello.static
 

MAKEFILE************
 
CC=g++
 
CCFLAGS=-Wall -g
 
LDFLAGS=-fPIC -shared
 
TASKPATH=.
 
 
all: init libmkdir.a
 cp -rf libmkdir.a  $(TASKPATH)/lib
 
init:
 mkdir -p $(TASKPATH)/task
 mkdir -p $(TASKPATH)/lib
 
 
libmkdir.a: mkdir_mod.o
 ar r libmkdir.a mkdir_mod.o
 
mkdir_mod.o: mkdir.h
 $(CC) -c $(CCFLAGS) mkdir_mod.cpp
 
clean:
 -rm -rf $(TASKPATH)/task
 -rm -rf $(TASKPATH)/lib
 -rm -rf libmkdir.a
 -rm -rf mkdir_mod.o
 
 
 

二。動態庫
 
編譯生成動態庫
 
     gcc getmaxlen.c –fPIC –shared –o libtest.so
 
由以上命令生成動態庫libtest.so,爲了不需要動態加載動態庫,在命令時需以lib開頭以.so爲後綴。
 
–fPIC:表示編譯爲位置獨立的代碼,不用此選項的話編譯後的代碼是位置相關的所以動態載入時是通過代碼拷貝的方式來滿足不同進程的需要,而不能達到真正代碼段共享的目的。
 
–shared:指明編譯成動態庫。
 
gcc test.c –L . –l test –o test
 
     –L:指明動態庫所在的目錄
 
      -l:指明動態庫的名稱,該名稱是處在頭lib和後綴.so中的名稱,如上動態庫libtest.so的l參數爲-l test。
 
 
 
MAKEFILE************
 
CC=g++
 
CCFLAGS=-Wall -g
 
LDFLAGS=-fPIC -shared
 
TASKPATH=.
 
 
all: init libtdir.so
 cp -rf libdir.so  $(TASKPATH)/lib
 
init:
 mkdir -p $(TASKPATH)/task
 mkdir -p $(TASKPATH)/lib
 
libdir.so: mkdir_mod.o
 $(CC)  mkdir_mod.cpp  $(LDFLAGS) -o libdir.so
 
 
clean:
 -rm -rf $(TASKPATH)/task
 -rm -rf $(TASKPATH)/lib
 -rm -rf libdir.so
 -rm -rf mkdir_mod.o



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