.a .so linux 生成_arm linux makefile 生成 .a .so - CSDN
精华内容
参与话题
  • 一般linux环境下的链接库分为a库和so库,分别表示静态链接库和动态链接库,其作用是把C程序编译好做成一种可执行链接文件,c主程序文件调用这些程序的函数接口是可以使用a库或so库,在主程序中只需要include含有库中...

    一般linux环境下的链接库分为a库和so库,分别表示静态链接库和动态链接库,其作用是把C程序编译好做成一种可执行链接文件,c主程序文件调用这些程序的函数接口是可以使用a库或so库,在主程序中只需要include含有库中提供的函数接口声明的头文件即可。

    一、生成a库

    首先,你需要写几个你要调用的函数的源文件,如test1.c、test2.c等。其代码如下:

    再将头文件写好(其实这里的头文件并不需要,若是编译成库的程序之间有调用关系的时候才用得到,只在调用链接库的时候编写头文件即可)。开始编译,将源文件编译成.o文件。命令行指令如下:


    然后开始生成a库,指令如下:


    注意:链接库前缀必须以lib开头

    得到libtest.a库文件后,然后将.a库链接到主程序中,写主程序main.c和头文件main.h 。

    加载a库,生成可执行文件并执行,指令如下:gcc main.c -L. -ltest -o test


    可以看到,a库连接成功,可以调用到里面的函数。

    二、生成so库

    利用上面所写过的test1.c 和test2.c生成.so库的指令如下:


    同样so库的前缀必须为lib,然后将.so库链接到主程序main.c中,这里需要注意一下,因为动态库的特性,编译器会到指定的目录去寻找动态库,目录的地址在/etc/ld.so.conf.d/ 目录里的libc.conf文件里,你可以在里面加一行地址表示你so库的位置,更改完conf文件里的内容,记得输入命令行:ldconfig。

    你还可以将so库复制到默认的目录下。这里是将so库复制到了默认目录下,生成可执行文件并运行,指令如下:

    gcc main.c -L. -ltest -o main


    静态链接库和动态链接库的区别在于,主程序在运行前,静态链接库的链接固定写入在程序中,而动态链接库则是在每次程序运行再加载链接。

    在加载动态链接库的时候,有可能会遇到加载不到的错误,原因在于系统默认加载的动态链接库路径里没有找到你的动态库,有三种解决方法:

    1.在执行gcc main.c -L. -ltest -o main 前,执行 export LD_LIBRARY_PATH=$(pwd)

    2.将你so所在的目录写到/etc/ld.so.conf文件里,然后执行ldconfig。

    3.将你的so放在/etc/ld.so.conf里的路径位置里。

    展开全文
  • linux生成.so文件和.a文件

    千次阅读 2019-01-23 10:48:37
    原文链接:...   linux生成.so文件和.a文件 test.h 1 #ifndef _TEST_H_ 2 #define _TEST_H_ 3 4 void TestA(); 5 void TestB(); 6 7 #endif   t...

    原文链接:http://www.cnblogs.com/tzhangofseu/archive/2011/11/15/2249585.html

     

    linux下生成.so文件和.a文件

    test.h

    复制代码

    1 #ifndef _TEST_H_
    2 #define _TEST_H_
    3 
    4 void TestA();
    5 void TestB();
    6 
    7 #endif

    复制代码


     

    test_a.cpp

    复制代码

    1 #include <stdio.h>
    2 #include "test.h"
    3 
    4 void TestA()
    5 {
    6     printf("TestA func\n");
    7 }

    复制代码


     

    test_b.cpp

    复制代码

    1 #include <stdio.h>
    2 #include "test.h"
    3 
    4 void TestB()
    5 {
    6     printf("TestB func\n");
    7 }

    复制代码


     

    生成so文件的命令

    g++ test_a.cpp test_b.cpp -fPIC -shared -o libtest.so

    生成.a文件的命令

    1 gcc -c test_a.cpp
    2 gcc -c test_b.cpp
    3 ar -r libtest.a test_a.o test_b.o



     

    test.cpp

    复制代码

    1 #include "test.h"
    2 
    3 int main()
    4 {
    5     TestA();
    6     TestB();
    7 
    8     return 0;
    9 }

    复制代码


     

    采用动态库编译命令

    g++ test.cpp -o test -L. -ltest


     

    执行

    export LD_LIBRARY_PATH=./
    ./test

    执行结果如下。

     

    采用静态库编译命令

    g++ -static -o test -L. -ltest test.cpp

    执行效果


    静态库的嵌套调用,有时候我想做一个自己的静态库,它里面要调用其他静态库里面的函数,经过试验

    这个好像用ar -r不行,所以就在链接的时候需要两个库文件都包含,同时要有这一个头文件才行。。。

    展开全文
  • 编辑四个文件:A1.c A2.c A.h test.cA1.c:#include &lt;stdio.h&gt;void print1(int arg){printf("A1 print arg:%d\n",arg);}A2.c:#include &lt;stdio.h&gt;void print2(char *arg){...

    编辑四个文件:A1.c  A2.c  A.h test.c

    A1.c:

    #include <stdio.h>

    void print1(int arg){
    printf("A1 print arg:%d\n",arg);
    }

    A2.c:

    #include <stdio.h>

    void print2(char *arg){
    printf("A2 printf arg:%s\n", arg);
    }

    A.h

    #ifndef A_H
    #define A_H
    void print1(int);
    void print2(char *);
    #endif

    test.c:

    #include <stdlib.h>
    #include "A.h"

    int main(){
    print1(1);
    print2("test");
    exit(0);
    }


    1、静态库.a文件的生成与使用。

    1.1、生成目标文件(xxx.o)

    ---> gcc -c A1.c A2.c


    1.2、生成静态库.a文件

    ---> ar crv libafile.a A1.o A2.o



    1.3、使用.a库文件,创建可执行程序(若采用此种方式,需保证生成的.a文件与.c文件保存在同一目录下,即都在当前目录下)

    ---> gcc -o test test.c libafile.a

    ---> ./test


    2、共享库.so文件的生成与使用

    2.1、生成目标文件(xxx.o)(此处生成.o文件必须添加"-fpic"(小模式,代码少),否则在生成.so文件时会出错)

    ---> gcc -c -fpic A1.c  A2.c

    2.2、生成共享库.so文件

    ---> gcc -shared *.o -o libsofile.so

    2.3、使用.so库文件,创建可执行程序

    ---> gcc -o test test.c libsofile.so

    ---> ./test

    发现出现错误:

    ./test: error while loading shared libraries: libsofile.so: cannot open shared object file: No such file or directory

    运行ldd test,查看链接情况

    ldd test
        linux-vdso.so.1 =>  (0x00007fff0fd95000)
        libsofile.so => not found
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f937b5de000)
        /lib64/ld-linux-x86-64.so.2 (0x0000563f7028c000)


    发现确实是找不到对应的.so文件。

    这是由于linux自身系统设定的相应的设置的原因,即其只在/lib and /usr/lib下搜索对应的.so文件,故需将对应so文件拷贝到对应路径。

    --->sudo cp libsofile.so /usr/lib

    再次执行./test,即可成功运行。

    ---> ./test


    同时可直接使用gcc -o test test.c -L. -lname,来使用相应库文件

    其中,

            -L.:表示在当前目录下,可自行定义路径path,即使用-Lpath即可。

          -lname:name:即对应库文件的名字(除开lib),即若使用libafile.a,则name为afile;若要使用libsofile.so,则name为sofile)。


    展开全文
  • 前面说了linux下的静态库。... A shared library (also known as a shared object, or as a dynamically linked library) is similar to a archive in that it is a grouping of object files. However,
    前面说了linux下的静态库。现在来说一说linux下的动态库。

         A shared library (also known as a shared object, or as a dynamically linked library) is similar to a archive in that it is a grouping of object files. However, there are many important differences.The most fundamental difference is that when a shared library is linked into a program, the final executable does not actually contain the code that is present in the shared library. Instead, the executable merely contains a reference to the shared library. If several programs on the system are linked against the same shared library, they will all reference the library, but none will actually be included.Thus, the library is “shared” among all the programs that link with it.

         A second important difference is that a shared library is not merely a collection of object files, out of which the linker chooses those that are needed to satisfy undefined references. Instead, the object files that compose the shared library are combined into a single object file so that a program that links against a shared library always includes all of the code in the library, rather than just those portions that are needed.

         To create a shared library, you must compile the objects that will make up the library using the -fPIC option to the compiler, like this:

    % gcc -c -fPIC test1.c

         The -fPIC option tells the compiler that you are going to be using test.o as part of a shared object.

                                                                                 ---摘自《Advanced Linux Programming》

    由上面可以看到,linux操作系统中,
    1.和静态库类似,动态库文件也是一些目标文件(后缀名为.o)的集合体而已。
    2.动态库的后缀名是.so,对应于windows操作系统的后缀名为.dll的动态库。
    3.可以使用gcc命令来创建一个动态库文件。
    来看一个实例,和静态库的代码实际是一样的。先看看可以编译成库文件的源文件中的代码:

    /*	test.c	*/
    int f() 
    {
      return 3;
    }

    代码非常简单。我们敲入下列命令:
    gcc -c -fPIC test.c
    gcc -shared -fPIC -o libtest.so test.o
    会在当前目录下生成一个libtest.so动态库文件。再看如何使用这个库。看如下代码:

    /*	app.c	*/
    #include <stdio.h>
    extern int f();
    int main() 
    {
      printf(“return value is %d\n”,f());
      return 0;
    }

    敲入如下命令:
    gcc –c app.c
    gcc -o app app.o -L. –ltest
    敲命令的时候要记得将libtest.a文件和生成的app.o文件放在同一个目录(即当前目录)下。这样,敲入命令后,会在当前目录下生成一个名为app的可执行文件。但是当我们执行./app命令,来执行这个可执行文件时,却提示如下错误:

    这就奇怪了,libtest.so文件明明就在当前目录下,为什么会提示找不到呢?继续看书,书上有这样的话:
         When you link a program with a shared library, the linker does not put the full path to the shared library in the resulting executable. Instead, it places only the name of the shared library.When the program is actually run, the system searches for the shared library and loads it.The system searches only /lib and /usr/lib, by default.If a shared library that is linked into your program is installed outside those directories, it will not be found, and the system will refuse to run the program.
    原来linux和windows的机制是不同的,它不会在当前目录下寻找动态连接库文件,它只会在标准路径下寻找。(The system searches only /lib and /usr/lib, by default.)。我们可以使用一个命令,使得操作系统去我们指定的路径下面去寻找。假设libtest.so文件所在的目录是/root/Desktop/aabb,那么执行命令
    export LD_LIBRARY_PATH=/root/Desktop/aabb
    后,再执行./app,我们发现,程序就正常运行了。

    展开全文
  • Linux下编译动态库及使用

    万次阅读 2018-10-10 15:38:23
    linux生成和使用动态库的步骤如下: 1,编写源文件。 2,将一个或几个源文件编译链接,生成共享库。 3,通过 -L&lt;path&gt; -lxxx 的gcc选项链接生成的libxxx.so。 4,把libxxx.so放入链接库的标准路径,或...
  • Linux-(C/C++)动态链接库生成以及使用(libxxx.so

    万次阅读 多人点赞 2018-01-28 22:35:57
    linux静态库生成与使用:http://www.cnblogs.com/johnice/archive/2013/01/17/2864319.html Linuxso文件为共享库,与windows下dll类似,不过实现要简单。 so可以供多个进程使用,不同进程调用同一个so文件,所...
  • linux下将c/c++编译成so库gcc -fPIC -shared Cat.c -o libcat.so-fPIC是压制警告 -shared是生成动态库 Cat.c是要编译的文件 -o是要生成的文件的名称linux下将c/c++生成可执行文件gcc -rdynamic -o main main.c -...
  • “  很多崩溃其实都发生在安静里,你坐在那里一动不动,内心世界却已经坍塌粉碎,一地狼藉。  ...
  • Linux下编译并使用 curl 静态库

    万次阅读 2011-05-17 21:21:00
    linux下面 编译后生成了 libcurl.a 文件, 但是在程序中静态链接 这个 libcurl.a 文件, 会发生很多的链接错误, 如果是动态链接 libcurl.a 文件则不会发生什么问题。/usr/lib/libcurl.a(ssluse.o): In function `...
  • Linux,ar,gcc,g++生成so,a文件

    千次阅读 2012-11-20 09:29:04
    linux生成.so文件和.a文件 test.h 1 #ifndef _TEST_H_2 #define _TEST_H_3 4 void TestA();5 void TestB();6 7 #endif test_a.cpp 1 #include 2 #include "test.h"3 4 void TestA()5 {6...
  • vs2017 增加了创建linux 工程的功能。具体步骤如下 在跨平台下创建Linux工程     ...创建完工程后开始配置项目 ...设置工程所需的include文件的路径 ...设置所需的.a文件,文件要包含绝对路径   编...
  • 最近在unbuntu环境下开发代码,由于很少使用linux开发环境,所以对linux编译方面了解更少,关于.o, .a, .so文件和可执行文件一直很困惑 今天特意查了一下关于它们的区分: .o 就相当于windows里的obj文件 ,一个...
  • 使用官方提供的config命令默认竟然没有生成 .so,解决办法执行 ./config 时增加参数 shared,例如: ./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl -Wl,-rpath,/usr/local/ssl/lib shared然后 ...
  • Linux下g++编译与使用静态库和动态库

    万次阅读 2014-03-07 17:27:12
    我们通常在IDE如VS的工程中开发C++项目,对于生成和使用静态库(*.lib)与动态库(*.dll)可能都已经比较熟悉,但是,在linux环境下,则是另一套模式,对应的静态库(*.a)与动态库(*.so)的生成与使用方式是不同的...
  • 根据GenDll.cpp文件,分别生成动态库.so和静态库...使用ar命令生成.a文件,可参考:Linux下动态库(.so)和静态库(.a)# 1、准备工作,编译方式、目标文件名、依赖库路径的定义。 CC = g++ CFLAGS := -Wall -O3 -std=c++0x
  • C/C++ 动态库so生成与调用

    千次阅读 2018-06-04 21:52:11
    1. Linux-(C/C++)动态链接库生成以及使用(libxxx.so)2. C++文件如何在linux生成动态库So,以及如何使用这个动态库3. c++ 发布动态.so简记1. 编译生成so库g++ src.cpp -fPIC -shared -o libxxx.so //使用...
  • linux中cmake 使用.so .a文件

    千次阅读 2017-09-15 15:57:11
    是不是拿到.so .a 文件直接在cmakelist.txt中添加下面两句就...答案当然不是,你还需要拿到头文件,如果没有头文件依旧无法使用,回忆下.so.a文件的生成过程,好像在生成的时候就没有用到头文件,因此我猜测.so.a文件
  • Linux Qt程序打包成一个可执行文件

    万次阅读 2017-06-20 15:08:27
    最近用Qt写了一个上位机, 而且是跨平台(Windows, Linux, ARM-Linux), 开发完成后需要对程序进行打包, windows的打包非常容易,选择非常多, 但是linux下面的选择就少了些. 方案的选择 Qt官方有页面专门说明Linux X11的...
  • .o文件::: 目标文件。就相当于windows里的obj文件 ,一个.c或.cpp文件对应一个.o文件.a...多个.a可以链接生成一个exe的可执行文件.so文件::: 是shared object即动态链接文件,和windows的.dll文件差不多,用于动
  • Linux 下cmake生成SO库的使用实例

    千次阅读 2019-01-08 11:03:02
    1、创建我的共享库:MySharedLib CMakeLists.txt cmake_minimum_required(VERSION 2.8) project(MySharedLib) # C++11 编译 set(CMAKE_CXX_STANDARD 11) #创建共享库 add_library(MySharedLib SHARED library.cpp ...
1 2 3 4 5 ... 20
收藏数 131,669
精华内容 52,667
关键字:

.a .so linux 生成