linux编译动态库和静态库的makefile示例

根据GenDll.cpp文件,分别生成动态库.so和静态库.a文件,需要依赖的外部库为opencv。

1. 静态库的生成

makefile命令的简介可参考:跟我一起写 Makefile。使用ar命令生成.a文件,可参考:Linux下动态库(.so)和静态库(.a)

# 1、准备工作,编译方式、目标文件名、依赖库路径的定义。

  • CC = g++
  • CFLAGS  := -Wall -O3 -std=c++0x 
  • # opencv 头文件和lib路径 
  • OPENCV_INC_ROOT = /usr/local/include/opencv 
  • OPENCV_LIB_ROOT = /usr/local/lib
  • OBJS = GenDll.o #.o文件与.cpp文件同名
  • LIB = libgendll.a # 目标文件名 
  • OPENCV_INC= -I $(OPENCV_INC_ROOT)
  • INCLUDE_PATH = $(OPENCV_INC)
  • LIB_PATH = -L $(OPENCV_LIB_ROOT)
  • # 依赖的lib名称
  • OPENCV_LIB = -lopencv_objdetect -lopencv_core -lopencv_highgui -lopencv_imgproc
  • all : $(LIB)
  • # 2. 生成.o文件 
  • %.o : %.cpp
  •     $(CC) $(CFLAGS) -c $< -o $@ $(INCLUDE_PATH) $(LIB_PATH) $(OPENCV_LIB) 
  • # 3. 生成静态库文件
  • $(LIB) : $(OBJS)
  •     rm -f $@
  •     ar cr $@ $(OBJS)
  •     rm -f $(OBJS)
  • tags :
  •      ctags -R *
  • # 4. 删除中间过程生成的文件 
  • clean:
  •     rm -f $(OBJS) $(TARGET) $(LIB)

 

2. 动态库的生成

第1、4步准备和收尾工作与静态库的保持一致,第2步和第3步所使用的命令稍有不同。

 

# 1、准备工作,编译方式、目标文件名、依赖库路径的定义。

  • CC = g++
  • CFLAGS  := -Wall -O3 -std=c++0x 
  • # opencv 头文件和lib路径 
  • OPENCV_INC_ROOT = /usr/local/include/opencv 
  • OPENCV_LIB_ROOT = /usr/local/lib
  • OBJS = GenDll.o #.o文件与.cpp文件同名
  • LIB = libgendll.so # 目标文件名 
  • OPENCV_INC= -I $(OPENCV_INC_ROOT)
  • INCLUDE_PATH = $(OPENCV_INC)
  • LIB_PATH = -L $(OPENCV_LIB_ROOT)
  • # 依赖的lib名称
  • OPENCV_LIB = -lopencv_objdetect -lopencv_core -lopencv_highgui -lopencv_imgproc
  • all : $(LIB)
  • # 2. 生成.o文件 
  • %.o : %.cpp
  •     $(CC) $(CFLAGS) -fpic -c $< -o $@ $(INCLUDE_PATH) $(LIB_PATH) $(OPENCV_LIB) 
  • # 3. 生成动态库文件
  • $(LIB) : $(OBJS)
  •     rm -f $@
  •     g++ -shared -o $@ $(OBJS)
  •     rm -f $(OBJS)
  • tags :
  •      ctags -R *
  • # 4. 删除中间过程生成的文件 
  • clean:
  •     rm -f $(OBJS) $(TARGET) $(LIB)

-fpic 和 -shared 命令可参考:Linux下动态库(.so)和静态库(.a)【注】这篇文章说可以使用ld命令生成.so文件,但我在测试时发会报错。

3. 动态库和静态库的调用
, 这两个的使用方法几乎没有区别。动态库的引用有显式和隐式两种,这里只说隐式调用。我使用main.cpp来测试生成的库文件, makefile如下:

  • CC = g++
  • CFLAGS  := -Wall -O3 -std=c++0x 
  • OPENCV_INC_ROOT = /usr/local/include/opencv 
  • OPENCV_LIB_ROOT = /usr/local/lib
  • MY_ROOT = ../
  • OPENCV_INC= -I $(OPENCV_INC_ROOT)
  • MY_INC = -I $(MY_ROOT)
  • EXT_INC = $(OPENCV_INC) $(MY_INC)
  • OPENCV_LIB_PATH = -L $(OPENCV_LIB_ROOT)
  • MY_LIB_PATH = -L $(MY_ROOT)
  • EXT_LIB = $(OPENCV_LIB_PATH) $(MY_LIB_PATH) 
  • OPENCV_LIB_NAME = -lopencv_objdetect -lopencv_highgui -lopencv_imgproc -lopencv_core 
  • MY_LIB_NAME = -lgendll
  • all:test
  • test:main.cpp
  •     $(CC) $(CFLAGS) main.cpp $(EXT_INC) $(EXT_LIB) $(MY_LIB_NAME) $(OPENCV_LIB_NAME) -o test
  • 4. 注意事项:
    1、在测试过程中,经常会报错:找不到.so文件。一种简单的解决方法如下: 
    在linux终端输入如下命令:

    export LD_LIBRARY_PATH=/home/shaoxiaohu/lib:LD_LIBRARY_PATH:

    更多解决方法可参考:Linux下gcc编译生成动态链接库*.so文件并调用它的第4部分。

    —–
    makefile还需要学习,有很多细节还没有很明白。现在仍没有做到活学活用,应用仅限于套模板。
    --------------------- 
    作者:有来有去-CV 
    来源:CSDN 
    原文:https://blog.csdn.net/shaoxiaohu1/article/details/46943417 
    版权声明:本文为博主原创文章,转载请附上博文链接!

你可能感兴趣的:(其他)