linux_____makefile_____模板
来源:互联网 发布:淘宝客怎么找佣金高的 编辑:程序博客网 时间:2024/06/05 20:48
如果一个代码,用configure来组织程序的,在ubuntu端可以用过./configure ;make ;make install 编译。
以下 转自:http://blog.csdn.net/lzx_bupt/article/details/7988192
1、编译动态库
- #############################################################
- # Makefile for shared library.
- # 编译动态链接库
- #############################################################
- #set your own environment option
- CC = g++
- CC_FLAG = -D_NOMNG -D_FILELINE
- #set your inc and lib
- INC =
- LIB = -lpthread -L./ -lsvrtool
- #make target lib and relevant obj
- PRG = libsvrtool.so
- OBJ = Log.o
- #all target
- all:$(PRG)
- $(PRG):$(OBJ)
- $(CC) -shared -o $@ $(OBJ) $(LIB)
- .SUFFIXES: .c .o .cpp
- .cpp.o:
- $(CC) $(CC_FLAG) $(INC) -c $*.cpp -o $*.o
- .PRONY:clean
- clean:
- @echo "Removing linked and compiled files......;
- rm -f $(OBJ) $(PRG)
2、编译静态库
- #############################################################
- # Makefile for static library.
- # 编译静态链接库
- #############################################################
- #set your own environment option
- CC = g++
- CC_FLAG = -D_NOMNG -D_FILELINE
- #static library use 'ar' command
- AR = ar
- #set your inc and lib
- INC =
- LIB = -lpthread -L./ -lsvrtool
- #make target lib and relevant obj
- PRG = libsvrtool.a
- OBJ = Log.o
- #all target
- all:$(PRG)
- $(PRG):$(OBJ)
- ${AR} rv ${PRG} $?
- .SUFFIXES: .c .o .cpp
- .cpp.o:
- $(CC) $(CC_FLAG) $(INC) -c $*.cpp -o $*.o
- .PRONY:clean
- clean:
- @echo "Removing linked and compiled files......"
- rm -f $(OBJ) $(PRG)
3、可执行程序
- ###########################################
- #Makefile for simple programs
- ###########################################
- INC=
- LIB= -lpthread
- CC=CC
- CC_FLAG=-Wall
- PRG=threadpooltest
- OBJ=CThreadManage.o CThreadPool.o CThread.o CWorkerThread.o threadpooltest.o
- $(PRG):$(OBJ)
- $(CC) $(INC) $(LIB) -o $@ $(OBJ)
- .SUFFIXES: .c .o .cpp
- .cpp.o:
- $(CC) $(CC_FLAG) $(INC) -c $*.cpp -o $*.o
- .PRONY:clean
- clean:
- @echo "Removing linked and compiled files......"
- 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文件中. 个人觉得第一种方法更好, 因为动态库应该看成一个可以独立运行的程序.
- linux_____makefile_____模板
- 模板
- 模板?
- 模板
- 模板
- 模板
- 模板
- 模板
- 模板
- 模板
- 模板
- 模板
- 模板
- 模板
- 模板
- 模板
- 模板
- 模板
- linux-0.11调试教程,Bochs-2.1.1配置文件,精简版可拷贝,及img文件制作过程
- CH0 安装配置Greenfoot
- 周赛(2)——双向队列
- 好吧~分析比较一下当前互联网JavaWeb不敌php等其他平台的原因~当然先收集信息 3
- java.lang.IllegalArgumentException: column '_id' does not exist
- linux_____makefile_____模板
- fedora 14下建立samba服务器
- 分页
- linux解压 tar命令
- java随机生成十六进制颜色
- Core Java (二十二) 列表(List接口)
- toad不用再转日期了- windows修改时间格式方法
- WINCE的BIB文件解析
- vb中获取gridview单元格内的值