嵌入式开发之makefile---交叉编译静态库和动态库的生成和调用
c和cpp 混合的动态库生成:
$(LIBSO): $(COBJS) $(CPPOBJS)
$(CPP) -shared -o $@ $^ $(LIBS)
//////////////////////////////////////////////////////////////////////////////
#for multchannel decoder makefile by pkf
BIN = client_system
BASE_INSTALL_DIR := /opt/arm-2009q1
BUILD_TOOL_DIR := $(BASE_INSTALL_DIR)
BUILD_TOOL_PREFIX := $(BUILD_TOOL_DIR)/bin/arm-none-linux-gnueabi-
CC = $(BUILD_TOOL_PREFIX)gcc
CPP = $(BUILD_TOOL_PREFIX)c++
LIBSO = librtspclient.so
INCS =
LIBS = -lpthread
SUBDIRS =
DEFINC = -I"./BasicUsageEnvironment/include" -I"./groupsock/include" -I"./liveMedia/include" \
-I"./UsageEnvironment/include"
#-I"./myclient"
INC_DIR := UsageEnvironment BasicUsageEnvironment liveMedia groupsock
INC := $(patsubst %,-I%/include,$(INC_DIR))
#CFLAGS := $(INC) -Wall -I $(KDIR)/include -DBSD=1 -DSOCKLEN_T=socklen_t -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -lpthread -I./ -g3 -O3
CSRCS = $(wildcard ./*.c ./BasicUsageEnvironment/*.c ./groupsock/*.c ./liveMedia/*.c \
./UsageEnvironment/*.c ./myclient/*.c)
CPPSRCS = $(wildcard ./*.cpp ./BasicUsageEnvironment/*.cpp ./groupsock/*.cpp ./liveMedia/*.cpp \
./UsageEnvironment/*.cpp ./myclient/*.cpp)
COBJS := $(CSRCS:.c=.o)
CPPOBJS := $(CPPSRCS:.cpp=.o)
MAKEDEPEND = gcc -MM -MT
CFLAGS = -O2 -Wall -DBSD=1 -DSOCKLEN_T=socklen_t -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64
CPPFLAGS = -O2 -Wall -DBSD=1 -DSOCKLEN_T=socklen_t -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64
CDEF = $(CSRCS:.c=.d)
CPPDEF = $(CPPSRCS:.cpp=.d)
PLATS = win32-debug win32-release linux-debug linux-release
none:
@echo "Please choose a platform"
@echo $(PLATS)
win32-debug:
$(MAKE) all INCS=-I"c:/mingw/include" LIBS="-L"c:/mingw/lib" -L"./../../lib/lxnet" -llxnet -lws2_32 -L"./../../lib/tinyxml" -ltinyxml" CFLAGS="-Wall -DWIN32 -DDEBUG -g" CPPFLAGS="-Wall -DWIN32 -DDEBUG -g"
win32-release:
$(MAKE) all INCS=-I"c:/mingw/include" LIBS="-L"c:/mingw/lib" -L"./../../lib/lxnet" -llxnet -lws2_32 -L"./../../lib/tinyxml" -ltinyxml" CFLAGS="-Wall -DWIN32 -DNDEBUG -O2" CPPFLAGS="-Wall -DWIN32 -DNDEBUG -O2"
linux-debug:
$(MAKE) all -lpthread CFLAGS="-Wall -DDEBUG -g" CPPFLAGS="-Wall -DDEBUG -g"
linux-release:
$(MAKE) all -lpthread CFLAGS="-Wall -DNDEBUG -O2" CPPFLAGS="-Wall -DNDEBUG -O2 -DBSD=1 -DSOCKLEN_T=socklen_t -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64"
all:$(BIN) fsupdate
lib:$(LIBSO) fsupdate
$(CDEF) : %.d : %.c
$(MAKEDEPEND) $(<:.c=.o) $< $(DEFINC) > $@
$(CPPDEF) : %.d : %.cpp
$(MAKEDEPEND) $(<:.cpp=.o) $< $(DEFINC) > $@
depend:
-rm $(CDEF)
-rm $(CPPDEF)
$(MAKE) $(CDEF)
$(MAKE) $(CPPDEF)
$(COBJS) : %.o: %.c
$(CC) -c $< -o $@ $(INCS) $(DEFINC) $(CFLAGS)
$(CPPOBJS) : %.o: %.cpp
$(CPP) -c $< -o $@ $(INCS) $(DEFINC) $(CPPFLAGS)
$(BIN) : $(COBJS) $(CPPOBJS)
$(CPP) -o $(BIN) $(COBJS) $(CPPOBJS) $(LIBS)
-rm $(COBJS) $(CPPOBJS)
$(LIBSO): $(COBJS) $(CPPOBJS)
$(CPP) -shared -o $@ $^ $(LIBS)
fsupdate:
# cp $(LIBSO) ../../../tirvideo_sdk/bell_lyb/rdk/demos/link_api_test_demos/linkapi
cp $(LIBSO) /home/tirvideo/lyb/armfs/opt/dvr_rdk/ti814x
# cp $(BIN) /home/tirvideo/lyb/armfs/opt/dvr_rdk/ti814x
.PHONY:clean cleanall
clean:
-rm $(BIN) $(COBJS) $(CPPOBJS) $(LIBSO)
-rm *.d
-rm *.obj
-rm *.o
-rm *.dep
-rm *.dep *.obj *.d
静态库的生成:
$(TargetLib): $(Cobjects)
$(AR) -rcs $(TargetLib) $^
# ar rcs ruv $(TargetLib) $^
/////////////////////////////////////////////////////////
Target = TestIni
TargetLib = inilib.a
BASE_INSTALL_DIR := /opt/arm-2009q1
BUILD_TOOL_DIR := $(BASE_INSTALL_DIR)
BUILD_TOOL_PREFIX := $(BUILD_TOOL_DIR)/bin/arm-none-linux-gnueabi-
AR := $(BUILD_TOOL_DIR)/bin/arm-none-linux-gnueabi-ar
GCC = $(BUILD_TOOL_PREFIX)gcc
G++ = $(BUILD_TOOL_PREFIX)g++
CInc = $(wildcard *.h)
CSrc = $(wildcard *.c)
Cobjects =$(CSrc:%.c=%.o)
$(Cobjects) : %.o: %.c
$(GCC) -c $< -o $@
#$(INCS) $(DEFINC) $(CFLAGS)
#Cobjects =$(patsubst %.c,%.o,$(CSrc))
lib:$(TargetLib)
release:$(Target)
$(Target): $(Cobjects)
echo $(GCC)
$(GCC) -o $@ $^
$(TargetLib): $(Cobjects)
$(AR) -rcs $(TargetLib) $^
# ar rcs ruv $(TargetLib) $^
##################test######################
#CInc += iniparser.h dictionary.h
#CSrc += iniparser.c dictionary.c
#Cobjects += iniparser.o dictionary.o
#CppObejects =
#$(Cobjects):$(Csrc)
# $(GCC) $(CInc) -c $<
#$(Target): iniparser.o dictionary.o
# $(GCC) -o $@ $^
#iniparser.o: iniparser.c
# $(GCC) $(CInc) -c $<
#dictionary.o: dictionary.c
# $(GCC) $(CInc) -c $<
clean:
rm -rf *.o $(Target) *.gch
值得注意的是在ubuntu上位机的编译
Cobjects =$(CSrc:%.c=%.o)
这一句就可以了,系统默认是cc编译即gcc
但是如果放在嵌入式下位机用的话就得加上下面这句话
$(Cobjects) : %.o: %.c
$(GCC) -c $< -o $@
静态库的调用:
#for makefile web module by pkf
.SUFFIXES:
.SUFFIXES: .o .c
.PHONY: clean mrclean distclean depend all dist
INSTALLDIR = $(EXEC_DIR)
GCC_FLAGS = -Wstrict-prototypes -Wpointer-arith -Wcast-align -Wcast-qual\
-Wtraditional\
-Wshadow\
-Wconversion\
-Waggregate-return\
-Wmissing-prototypes\
-Wnested-externs\
-Wall \
-Wundef -Wwrite-strings -Wredundant-decls -Winline \
-mshort-calls
BASE_INSTALL_DIR := /opt/arm-2009q1
BUILD_TOOL_DIR := $(BASE_INSTALL_DIR)
BUILD_TOOL_PREFIX := $(BUILD_TOOL_DIR)/bin/arm-none-linux-gnueabi-
srcdir = .
LDFLAGS = -g -lpthread -ldl
LIBS =
CFLAGS = -O3 -pipe -Wall
CFLAGS += -I./cgi.h
LEX = flex
CC = $(BUILD_TOOL_PREFIX)gcc
CPP = $(BUILD_TOOL_PREFIX)gcc -E
SOURCES = data_process.c data_update.c server_api.c net_config.c
USOURCES = upload.c cgic.c
OBJS =$(SOURCES:.c=.o)
UOBJS =$(USOURCES:.c=.o)
all: data_update.cgi upload.cgi fsupdate
install: data_update.cgi
install data_update.cgi $(INSTALLDIR)
# make fsupdate
data_update.cgi: $(OBJS) $(LIBS)
$(CC) -o $@ $^ -L. inilib.a $(LDFLAGS) $(CFLAGS)
upload.cgi: $(UOBJS) $(LIBS)
$(CC) -o $@ $^ $(LDFLAGS) $(CFLAGS)
clean:
rm -f $(OBJS) $(UOBJS) data_update.cgi upload.cgi
fsupdate:
@echo "--------------------------------------------------------------"
@echo "| !!!!!!!!!!!!!!<file update sucess>!!!!!!!!!!!!! |"
@echo "--------------------------------------------------------------"
cp *.html /home/tirvideo/lyb/armfs/var/www/
cp *.txt /home/tirvideo/lyb/armfs/var/www/
cp ./*.cgi /home/tirvideo/lyb/armfs/var/www/cgi-bin/
chmod 777 /home/tirvideo/lyb/armfs/var/www/*.html
chmod 777 /home/tirvideo/lyb/armfs/var/www/cgi-bin/*.cgi
distclean: mrclean
mrclean: clean
rm -f config.status Makefile config.log
.depend:
$(CPP) -MM $(SOURCES) > .depend
depend:
-rm -f .depend
$(MAKE) .depend
include .depend
# tags
tags: $(SOURCES)
ctags -o tags $^ *.h
# dist
dist:
$(MAKE) clean
./makedist.sh
# object dump
boa.objdump: data_update.cgi
objdump --disassemble-all --source data_update.cgi > $@
http://www.cnblogs.com/zhoujg/p/5054122.html
嵌入式开发之makefile---交叉编译静态库和动态库的生成和调用的更多相关文章
- Makefile中静态库,动态库的创建和使用以及解压缩命令
应用层通过操作文件操控硬件 使用制作好的工具链: 刚开始学习时,用一些已经制作好的工具链,使用以下命令解压到gcc-3.4.5-glibc-2.3.6目录 cd /work/tools tar xjf ...
- Ubuntu下通过makefile生成静态库和动态库简单实例
本文转自http://blog.csdn.net/fengbingchun/article/details/17994489 Ubuntu环境:14.04 首先创建一个test_makefile_gc ...
- makefile生成静态库和动态库
库是一种软件组件技术,库里面封装了数据和函数. 库的使用可以使程序模块化. Windows系统包括静态链接库(.lib文件)和动态链接库(.dll文件). Linux通常把库文件存放在/usr/lib ...
- C++ 系列:静态库与动态库
转载自http://www.cnblogs.com/skynet/p/3372855.html 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择 ...
- C++静态库与动态库
C++静态库与动态库 这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一 ...
- 在Linux下如何使用GCC编译程序、简单生成 静态库及动态库
最近在编写的一个Apache kafka 的C/C++客户端,,在看他写的 example中,他的编译是用librdkafka++.a和librdkafka.a 静态库编译的,,,而我们这 ...
- android开发 NDK 编译和使用静态库、动态库 (转)
在eclipse工程目录下建立一个jni的文件夹 在jni文件夹中建立Android.mk和Application.mk文件 Android.mk文件: Android提供的一种makefile文件, ...
- [转]Linux下用gcc/g++生成静态库和动态库(Z)
Linux下用gcc/g++生成静态库和动态库(Z) 2012-07-24 16:45:10| 分类: linux | 标签:链接库 linux g++ gcc |举报|字号 订阅 ...
- C 高级编程3 静态库与动态库
http://blog.csdn.net/Lux_Veritas/article/details/11934083http://www.cnblogs.com/catch/p/3857964.html ...
- (转)C++静态库与动态库
转自:http://www.cnblogs.com/skynet/p/3372855.html C++静态库与动态库 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别, ...
随机推荐
- (原创)c++11中的日期和时间库
c++11提供了日期时间相关的库chrono,通过chrono相关的库我们可以很方便的处理日期和时间.c++11还提供了字符串的宽窄转换功能,也提供了字符串和数字的相互转换的库.有了这些库提供的便利的 ...
- 【Android】事件处理系统
linux输入子系统 Android是linux内核的,所以它的事件处理系统也在linux的基础上完成的. Linux内核提供了一个Input子系统来实现的,Input子系统会在/dev/input/ ...
- Docker 构建网络服务后本机不能访问
Docker 构建网络服务后本机不能访问 起因 使用tornado构建了一个服务,测试都没有问题 使用docker构建镜像,使用docker run image_name启动服务 使用浏览器访问 12 ...
- js生成二维码实例
<!DOCTYPE html><html><head> <title></title> <meta charset=&qu ...
- django模型查询
概述 查询集表示从数据库获取的对象的集合 查询集可以有多个过滤器 过滤器就是一个函数,基于所给的参数限制查询集结果 从SQL角度来说,查询集和select语句等价,过滤器就像where条件 查询集 在 ...
- 线程安全的无锁RingBuffer的实现【一个读线程,一个写线程】
在程序设计中,我们有时会遇到这样的情况,一个线程将数据写到一个buffer中,另外一个线程从中读数据.所以这里就有多线程竞争的问题.通常的解决办法是对竞争资源加锁.但是,一般加锁的损耗较高.其实,对于 ...
- ARKit从入门到精通(6)-ARSession介绍
转载:http://blog.csdn.net/u013263917/article/details/73157082 ARSession是一个连接底层与AR视图之间的桥梁,其实ARSCNView内部 ...
- js+jquery检测用户浏览器型号(转)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 一场由SD卡引发的灾难_转
注:此文章转自“https://user.qzone.qq.com/63915185/blog/1512562541”. Flash里面的数据在使用过程中莫名改变或不翼而飞?程序丢失可能无法正 ...
- Java编程的逻辑 (54) - 剖析Collections - 设计模式
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...