linux_____makefile_____模板

来源:互联网 发布:淘宝客怎么找佣金高的 编辑:程序博客网 时间:2024/06/05 20:48

如果一个代码,用configure来组织程序的,在ubuntu端可以用过./configure ;make ;make install 编译。

那么在嵌入式端 则可以通过这样:./configure --host=arm-linux CC=arm-linux-gcc   或者:./configure --host=arm-linux CC=arm-linux-gcc --prefix=/usr/local 来做。

以下 转自:http://blog.csdn.net/lzx_bupt/article/details/7988192

1、编译动态库

  1. #############################################################   
  2. # Makefile for shared library.  
  3. # 编译动态链接库  
  4. #############################################################  
  5. #set your own environment option  
  6. CC = g++  
  7. CC_FLAG = -D_NOMNG -D_FILELINE  
  8.   
  9. #set your inc and lib  
  10. INC =   
  11. LIB = -lpthread -L./ -lsvrtool  
  12.   
  13. #make target lib and relevant obj   
  14. PRG = libsvrtool.so  
  15. OBJ = Log.o  
  16.   
  17. #all target  
  18. all:$(PRG)  
  19.   
  20. $(PRG):$(OBJ)  
  21.     $(CC) -shared -o $@ $(OBJ) $(LIB)  
  22.   
  23. .SUFFIXES: .c .o .cpp  
  24. .cpp.o:  
  25.     $(CC) $(CC_FLAG) $(INC) -c $*.cpp -o $*.o  
  26.   
  27. .PRONY:clean  
  28. clean:  
  29.     @echo "Removing linked and compiled files......;  
  30.     rm -f $(OBJ) $(PRG)  

2、编译静态库


  1. #############################################################  
  2. # Makefile for static library.  
  3. # 编译静态链接库  
  4. #############################################################  
  5. #set your own environment option  
  6. CC = g++  
  7. CC_FLAG = -D_NOMNG -D_FILELINE  
  8.   
  9. #static library use 'ar' command   
  10. AR = ar  
  11.   
  12. #set your inc and lib  
  13. INC =   
  14. LIB = -lpthread -L./ -lsvrtool  
  15.   
  16. #make target lib and relevant obj   
  17. PRG = libsvrtool.a  
  18. OBJ = Log.o  
  19.   
  20. #all target  
  21. all:$(PRG)  
  22. $(PRG):$(OBJ)  
  23.     ${AR} rv ${PRG} $?  
  24.   
  25. .SUFFIXES: .c .o .cpp  
  26. .cpp.o:  
  27.     $(CC) $(CC_FLAG) $(INC) -c $*.cpp -o $*.o  
  28.   
  29. .PRONY:clean  
  30. clean:  
  31.     @echo "Removing linked and compiled files......"  
  32.     rm -f $(OBJ) $(PRG)  

3、可执行程序

  1. ###########################################  
  2. #Makefile for simple programs  
  3. ###########################################  
  4. INC=  
  5. LIB= -lpthread  
  6.   
  7. CC=CC  
  8. CC_FLAG=-Wall  
  9.   
  10. PRG=threadpooltest  
  11. OBJ=CThreadManage.o CThreadPool.o CThread.o CWorkerThread.o threadpooltest.o  
  12.   
  13. $(PRG):$(OBJ)  
  14.     $(CC) $(INC) $(LIB) -o $@ $(OBJ)  
  15.       
  16. .SUFFIXES: .c .o .cpp  
  17. .cpp.o:  
  18.     $(CC) $(CC_FLAG) $(INC) -c $*.cpp -o $*.o  
  19.   
  20. .PRONY:clean  
  21. clean:  
  22.     @echo "Removing linked and compiled files......"  
  23.     rm -f $(OBJ) $(PRG)  


随机组合、举一反三会写出适合项目的makefile

---------------------------------------------------------------------------------------------------------------------------------自己的总结:

$^所有不重复的依赖文件,以空格分开
$@目标文件的完整名称
$<第一个依赖文件的名称
实验发现:
1ssssssssssstep1:把当前目录下的所有文件变成.o文件可以这样(C语言直接把cpp改成c即可)
.cpp.o:  
$(CPP) $(CC_FLAG) $(INC) -c $< 
或者这样:
.cpp.o:  
$(CPP) $(CC_FLAG) $(INC) -c $*.cpp -o $*.o    

2sssssssssstep2: 把.o文件链接成自己想要的各种文件(.a/.so/.bin)
 2.1动态库
PRG = test.so  
OBJ = test1.o test2.o test3.o


all:$(PRG)  
$(PRG):$(OBJ)  
$(CPP) -shared -o $@ $(OBJ)
  2.2静态库
AR = ar  ///<----这里不同,
PRG = test1.a  
OBJ = test1.o test2.o test3.o 


all:$(PRG)  
$(PRG):$(OBJ)  
    ${AR} rv ${PRG} $? 


  2.3可执行文件
PRG=test
OBJ= test1.o test2.o test3.o
  
$(PRG):$(OBJ)  
    $(CC) -o $@ $(OBJ)  
如果有多个目录的话,一样分级make:
all:
cd $(LIVEMEDIA_DIR) ; $(MAKE)
install:
cd $(LIVEMEDIA_DIR) ; $(MAKE) install
clean:
cd $(LIVEMEDIA_DIR) ; $(MAKE) clean
distclean: clean
-rm -f $(LIVEMEDIA_DIR)/Makefile $(GROUPSOCK_DIR)/Makefile 

-----------------------------------------------------------最经典的一个makefile-------------------------------------------------

多目录下makefile,自动依赖  

转自:http://lcinx.blog.163.com/blog/static/434942672009818113152217/

BIN = test.exe
CC = gcc
INCS = -I"c:/dev-cpp/include"
LIBS = -L"c:/dev-cpp/lib" 

#maintest.c tree/rbtree.c  多了子目录,那就直接添加 目录/*.c即可   所有的源文件--  .c文件列表
SRCS = $(wildcard *.c ./tree/*.c ./config/*.c)
OBJS =$(SRCS:.c=.o)

#
#生成依赖信息 -MM是只生成自己的头文件信息,-M 包含了标准库头文件信息。
MAKEDEPEND = gcc -MM    
CFLAGS = $(INCS)
                    
all:$(BIN)

#生成.o的对自己目录中.h .c的依赖信息到当前文件的.depend文件中
.depend:
    $(MAKEDEPEND) $(SRCS) > $@

#这里出现了一个 $(MAKE) 没有定义的变量。这个变量是由 Make 自己定义的,它的值即为自己的位置,方便 Make #递归调用自己。
depend:
    rm .depend
    $(MAKE) .depend

$(OBJS) : %.o:%.c
    $(CC) -c $< -o $@ $(CFLAGS)
$(BIN) : $(OBJS)
    $(CC) -o $(BIN) $(OBJS) $(LIBS)


include .depend    
.PHONY:clean cleanall

clean:            
    rm $(BIN) $(OBJS)
cleanall:
    rm .depend
    rm $(BIN) $(OBJS)

///==================================================================

把当前的.c文件全部变成.o文件
最简单的是:
gcc -c *.c 
然后把 其中的一些文件编译成静态库:
ar -r libtest_lib.a test_lib.o
再把另一些文件编译成动态库:(同时把静态库编译进动态库中)
 gcc -shared testso.o -ltest_lib -L./ -o libtestso1.so
再把动态库编译进可执行文件中:
gcc test.c -ltestso1 -o test

总结:  可以看到其实 动态库和静态库  都是一个库,都可以用-l的形式来加载,包括加载进别库中。

///---------------------------以下转自:http://hi.baidu.com/proinsight/item/150dd3e6e506d1a9c10d7552

动态库调用静态库.

生成动态库: 需要的目标文件得用-fPIC选项生成.

而静态库所需的目标文件可以不用-fPIC选项.

一个应用程序调用动态库, 而这个动态库其中的函数调用某静态库时,如何生成应用程序呢?

例:

/////// static.h

void static_print();

///////static.cpp

#include <iostream>

#include "static.h"

void static_print() {

     std::cout<<"This is static_print function"<<std::endl;

}

////// shared.h

void shared_print();

////// shared.cpp

#include <iostream>

#include "shared.h"

#include "static.h"

void shared_print() {

       std::cout<<"This is shared_print function";

        static_print();

}

////////test.cpp

   #include "share.h"
  
int main()
{
       shared_print();
       return 0;
   }

方法一:

      静态库的.o文件也用-fPIC生成. 生成动态库时把静态库加入.

     生成应用程序时只加载动态库

     g++ -c -fPIC static.cpp // 生成static.o

     ar -r libstatic.a static.o // 生成静态库libstatic.a

     g++ -c -fPIC shared.cpp // 生成shared.o

     g++ -shared shared.o -lstatic -o libshared.so   // 生成动态库libshared.so 注: -shared是g++的选项,与shared.o无关. -lstatic选项把libstatic.a的函数加入动态库中.

     g++ test.cpp -lshared -o test.exe // link libshared.so 到test.exe中.

方法二:

     静态库的.o文件不用-fPIC生成. 生成动态库时不加表态库.

    生成应用程序时加载动态库和静态库.

     g++ -c static.cpp // 生成static.o

     ar -r libstatic.a static.o // 生成静态库libstatic.a

     g++ -c -fPIC shared.cpp // 生成shared.o

     g++ -shared shared.o -o libshared.so // 生成动态库libshared.so 注: -shared是g++的选项,与shared.o无关. 这时如果加-lstatic. error:relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC

     g++ test.cpp -lshared -lstatic -o test.exe // link libshared.so 到test.exe中.

两种方法的不同之处在于static_print的实际代码一个在.so中.一个在最后test.exe文件中. 个人觉得第一种方法更好, 因为动态库应该看成一个可以独立运行的程序.


原创粉丝点击