精华内容
下载资源
问答
  • 静态库:使用静态库制作工具:ar rcs libname.a a.o b.o c.o 优点:将函数库中的函数本地化。寻址方便,速度快。 缺点:每个使用静态库的进程都要将库编译到可执行文件中加载到内存。内存消耗严重 动态库: 1 ...

    静态库:使用静态库制作工具:ar rcs libname.a a.o b.o c.o
    优点:将函数库中的函数本地化。寻址方便,速度快。
    缺点:每个使用静态库的进程都要将库编译到可执行文件中加载到内存。内存消耗严重
    动态库:
    1 生成“与位置无关”的目标文件gcc -fPIC a.c b.c c.c –c(参数 -fPIC 表示生成与位置无关代码)
    2 使用gcc -shared选项:gcc -shared -o libname.so a.o b.o c.o
    优点:多进程共享一份库文件,节省内存、易于更新
    缺点:相较于静态库而言库函数访问略慢。


    静态库

    SrcFiles = $(wildcard ./src/*.c)
    ObjFiles = $(patsubst %.c,%.o,$(SrcFiles))


    path = -I./include


    app1:libzjc.a
    gcc main.c -o $@ $(path) -L ./ -l zjc

    libzjc.a:$(ObjFiles)
    ar -rcs $@ $(ObjFiles)

    %.o:%.c
    gcc -c $< $(path) -o $@ 

    clean:
    -@rm -f ./src/*.o
    -@rm -f app1


    动态库

    SrcFiles = $(wildcard ./src/*.c)
    ObjFiles = $(patsubst %.c,%.o,$(SrcFiles))

    path = -I./include

    app2:libzjc.so
    gcc main.c -o $@ $(path) -L ./ -l zjc

    libzjc.so:$(ObjFiles)
    gcc -shared -o $@ $(ObjFiles)

    %.o:%.c
    gcc -c $< -fPIC $(path) -o $@


    clean:
    -@rm -f ./src/*.o
    -@rm -f app2
    -@rm -f libzjc.so


    找不到动态库.so的问题
    第一种:
    使用环境变量 LD_LIBRARY_PATH
    ○ 动态库的绝对路径添加到该环境变量中
    ○ LD_LIBRARY_PATH = /usr/include/xxx:$LD_LIBRARY_PATH
    ○ export LD_LIBRARY_PATH
     直接在shell中 - 临时设置
     写入配置文件
    □ ~/.bashrc - 用户级别
    □ /etc/prefile - 系统级别
    第二种:
    给动态库设置软连接 /usr/kevin/fastdfs
    ○ 将软链接放到 /usr/lib /usr/lib64 /lib /lib64
    ○ sudo ln -s /usr/kevin/fastdfs/xxx.so /usr/lib/libxxx.so
    第三种:
    刷新 /etc/ld.so.cache
    首先 vi /etc/ld.so.conf
    将动态库的绝对路径写入该文件中
    sudo ldconfig -v


    展开全文
  • 根据GenDll.cpp文件,分别生成动态库.so和静态库....使用ar命令生成.a文件,可参考:Linux下动态库(.so)和静态库(.a) # 1、准备工作,编译方式、目标文件名、依赖库路径的定义。 CC = g++ CFLAGS := -Wall -O3 -s...

    根据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 
      版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • 介绍linux生成和使用动态链接静态链接Makefile的编写方法。   2. 生成动态链接Makefile 首先要有一个c或c++等工具编写出来的库函数文件,也就是里面写了一堆可以被别的函数调用的函数。比如...

    生成和使用动态链接库和静态链接库的Makefile编写

    1. 概述

    介绍linux下生成和使用动态链接库和静态链接库的Makefile的编写方法。

     

    2. 生成动态链接库的Makefile

    首先要有一个c或c++等工具编写出来的库函数文件,也就是里面写了一堆可以被别的函数调用的函数。比如:

     

    aaa.cpp

    #include <stdio.h>

    void pf1(void)

    {

        printf(“********\n”);

        return;

    }

     

    void pf2(void)

    {

        printf(“#########\n”);

        return;

    }

     

    接着要写编译这个函数的Makefile

    要把一个文件编译成动态链接库文件需要分两个步骤

    第一步:将这个文件编译成.o文件

    CPP=c++

    CPPFLAGS=-c

    $(CPP) $(CPPFLAGS) aaa.cpp -o aaa.o

    这里是编译cpp文件,就用的是C++,如果是编译.c文件,就需要使用gcc

    第二步:将这个.o文件链接成动态链接库文件

    LD=ld

    LIB = libaaa.so

    $(LD) -shared -o $(LIB) haspapi.o

    动态链接库文件的名字一定要以lib开头,后缀是.so

    编译中一定要加上-shared,表示是生成动态链接库

     

    3. 生成静态链接库

    还是使用上面的文件,编写Makefile

    同样也是分两步,第一步和上面一样,我直接拷贝过来

    第一步:将这个文件编译成.o文件

    CPP=c++

    CPPFLAGS=-c

    $(CPP) $(CPPFLAGS) aaa.cpp -o aaa.o

    这里是编译cpp文件,就用的是C++,如果是编译.c文件,就需要使用gcc

    第二步:将这个.o文件链接成静态链接库文件

    LIB = libaaa.a

    AR=ar

    (AR) -r $(LIB) aaa.o

    静态链接库文件的后缀是.a,同样也是需要以lib开头

     

    4. 链接库的使用

    首先需要编写一个使用了链接库文件中函数的c或者c++文件

     

    bbb.cpp

    extern void pf1(void);

    extern void pf2(void);

     

    int main(void)

    {

        pf1();

        pf2();

        return 0;

    }

     

     

    使用链接库,Makefile文件如下:

    $(CPP) bbb.cpp -I. -L. -o bbb.o -laaa

    这里不分是动态的还是静态的,但是,如果使用动态链接库,运行时需要将aaa.so文件拷贝到/usr/lib下,静态库则不需要。

    上面的例子是在redhat9上运行测试过的。

     

    PS:由于对C++了解甚少,所以直接用c写得c++文件

    展开全文
  • 根据GenDll.cpp文件,分别生成动态库.so和静态库.a文件,需要依赖的外部库为opencv。 1. 静态库生成 makefile命令的简介可参考:跟我一起写 ...使用ar命令生成.a文件,可参考:Linux下动态库(.so)和静态库(....

    (转自:https://blog.csdn.net/shaoxiaohu1/article/details/46943417

     

    根据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)
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    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)
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    -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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    4. 注意事项:

    1、在测试过程中,经常会报错:找不到.so文件。一种简单的解决方法如下: 
    在linux终端输入如下命令:

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

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

    —–

    makefile还需要学习,有很多细节还没有很明白。现在仍没有做到活学活用,应用仅限于套模板。

     

    展开全文
  • 生成Linux静态库的工程模板,只要在Makefile 文件中添加工程中源文件头文件的路径,就可以生成Linux静态库。这里是demo工程。
  • 库文件源码为:app.c使用库文件源码为:main.c静态链接库生成:gcc -c app.car rcs libtest.a app.o静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。例如:我们要生成名为test的静态库,则静态...
  • Linux下,工程管理器make是可用于自动编译、链接程序的实用工具。我们要做的是写一个Makefile... GNU autotools作用:收集系统配置信息并自动生成Makefile文件。  GNU autotools主要包括三个工具:autoconf、automa
  • #=============================================# Makefile (linux) for S21SDK Sample : testnc#=============================================SHELL = /bin/shCC = mipsel-linux-gccAR = mipsel-linux-arC
  • #=============================================# Makefile (linux) for S21SDK Sample : testnc#=============================================SHELL = /bin/shCC = mipsel-linux-gccAR = mipsel-linux-arC
  • 文章目录1 编写源文件及makefile生成静态库2 编写接口文件(xx.h)3 链接动态库生成可执行文件4 执行(无需指定动态库位置)在嵌入式linux中使用动态库(拿移远CEFI举例) 静态库 Static library 静态库是obj文件...
  • Makefile 一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,...在 Linux(unix )环境下使用GNU 的make工具能够比较容易的构建一个属
  • linux下的静态库与动态库的区别 1.什么是库 在windows平台和linux平台下都大量存在着库。 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。 由于windows和linux的本质不同,因此二者库...
  • 背景:写这篇博客的原因是:最近在搞嵌入式,需要交叉编译opencv文件,自己写Makefile,通过arm-linux-g++编译、链接、生成可执行文件,从而实现了移植的过程。平台是Toradex的Apalis TK1,三千多元,买回来我就...
  • Makefile文件的编写 ################################################################ #自动将src目录下所有的cpp、cc和c文件编译,生成所有.o文件保存在bin/obj下 #...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 258
精华内容 103
关键字:

linux生成静态库makefile

linux 订阅