精华内容
下载资源
问答
  • 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不行,所以就在链接的时候需要两个库文件都包含,同时要有这一个头文件才行。。。

    展开全文
  • Linux下生成.so文件

    千次阅读 2016-07-28 09:47:00
    linux下.so文件即Shared Libraries。Shared Library 是程序运行时加载的库文件。当一个shared library 被成功的安装以后,之后启动的所有程序都会自动使用最新的shared library。也就是说,生成一个.so文件并告诉...

    .so文件是什么?

    linux下的.so文件即Shared Libraries。Shared Library 是程序运行时加载的库文件。当一个shared library 被成功的安装以后,之后启动的所有程序都会自动使用最新的shared library。也就是说,生成一个.so文件并告诉编译器它的位置之后,所有的需要引入它的程序都可以同时调用它。

    使用.so文件有以下这么几个好处:

    • 升级库但是可以继续支持一些程序,这些程序想要使用较老版本的,或者不向后兼容的库。
    • 重写特定的库文件或者甚至可以在执行特定程序时,指定一个库文件的特定函数
    • 做以上这些的时候程序甚至可以正在使用着当前的库文件

    每一个shared library都有一个soname、一个real name、一个linker name。

    soname有一个前缀lib、自定义的短语、后跟一个.so、还有一个版本号。如:/usr/lib/libreadline.so.3

    real name是一个soname的实体,在文件名中包涵了真实的库版本号。real name相比soname添加了一个句点,一个次要版本号,另一个句点,和一个发型版本号。最后一个句点和发行版本号是可选的。次要号码和发行号码支持配置控制,使别人可以明白安装的是哪个确切的版本。

    linker name是没有任何版本号的soname。如/usr/lib/libreadline.so。

    管理shared libraries的关键就是将这个文件名拆开。当程序内部列出它们需要的shared libraries时,仅仅需要列出soname即可。相反的,当创建一个shared library时,你只需要创建一个特定的文件名(包括详细的版本信息)即可。当你安装了一个新版本的库时,你只需将它安装在一小部分特殊的文件夹中的一个之中,然后运行程序ldconfig。lgconfig将会检查现存的文件,并且创建real name的soname和symbolic link,同时设置好春村文件。缓存文件位于/etc/ld.so.cache。

    ldconfig并不设置linker name;通常这是在库安装时干的事,然后linker name作为指向最新soname或者realname的symbolic link被创建。

    symbolic link(软连接)是自己指定的。名字如: /usr/lib/libreadline.so.3.0。

    linker name就是一个与/usr/lib/libreadline.so.3相关联的symbolic link。

    如果以上看不懂的话,是的我也没看懂,只是大体翻译了这篇文章

    LD_LIBRARY_PATH
    这个路径中的库文件将被在正常寻找前首先寻找。

    注意事项

    1. .so文件(也就是Shared Libraries)必须以lib开头,以.so结尾,比如:libalpha.so。(作为特例,一些最低级的C库并不是以lib开头的)
    2. 必须将自定义的文件加入到LD_LIBRARY_PATH中才能运行。

    生成并测试.so文件。

    aplusb.c

    #include <iostream>
    #include "aplusb.h"
    using namespace std;
    int aPlusB(int a, int b)
    {
        int c = a + b;
        return c;
    } 

    aplusb.h

    #ifndef APLUSB_H__
    #define APLUSB_H__
    extern int aPlusB(int a, int b);
    #endif

    main.c

    #include <iostream>
    #include "aplusb.h"
    using namespace std;
    int main(void)
    {
        int a = 1;
        int b = 2;
        int c = 0;
        c = aPlusB(a, b);
        cout<<c<<endl;
        return 0;
    }

    第一步:创建PIC文件

    g++ -c -fPIC aplusb.c

    pic代码是位置无关代码,程序运行时计算机会找文件中指定的内存地址去读取数据,但是当读取一个库文件时,库本身指定的地址必须是与内存地址无关的。此时生成了aplusb.o。注意-fPIC比-fpic兼容性要高。

    -c 为编译和汇编但是不链接。

    生成的.o文件为机器码。

    第二步:用第一步生成的文件去创建.so文件。

    g++ -shared -o libaplusb.so aplusb.o

    第三步:链接

    g++ -L/home/lee/JNI -o main main.c -laplusb

    第四步: 保证运行时可以调用

    $ export LD_LIBRARY_PATH=/home/lee/JNI:$LD_LIBRARY_PATH

    至此

    第五部:运行

    lee@lee-computer:~/JNI$ ./main
    3

    结果为3。调用成功。

    展开全文
  • linux下生成.so并运行程序加载该.so

    千次阅读 2016-10-26 14:33:01
    -shared -fPIC -o libtest.so test.c即可。回车后输入ls,我们就可以发现当前目录下面出现了libtest.so文件 在上面的代码当中,我们发现使用到了add函数,那么此时如何才能生成一个执行文件呢?也很简单,输入gcc ...

              此时如果我们想要生成动态库,要做的工作其实非常简单,输入gcc -shared -fPIC -o libtest.so test.c即可。回车后输入ls,我们就可以发现当前目录下面出现了libtest.so文件
    在上面的代码当中,我们发现使用到了add函数,那么此时如何才能生成一个执行文件呢?也很简单,输入gcc hello.c -o  hello ./libtest.so。然后输入./hello,此时可以验证一下执行文件运行是否正确。在编写静态库的时候,我说过静态库是汇编链接到执行文件当中的,而动态库不会。朋友们可以做个小实验,删除libtest.so,然后输入./hello。此时大家可以看看系统有没有错误返回?
    这个时候,有的朋友就会问了,那在windows下面dll应该怎么编写呢?其实也不难,只要在test.h上面稍作改变即可。其他的步骤和静态库的操作是基本类似


    展开全文
  • 时间不早了, 先下班了。。。 明天再写。。 转载于:https://www.cnblogs.com/ruili07/p/9916769.html

    时间不早了, 先下班了。。。 明天再写。。

    转载于:https://www.cnblogs.com/ruili07/p/9916769.html

    展开全文
  • func.c const char *myfunc() { return "so file test"; } main.c #include #include main() { printf("%s/n", myfunc()); return 0; } 1....
  • 二、生成 .so 三、调用.a 四、调用.so 1.隐式调用 2.显式调用 对于一个dll.cpp内容如下: 定义2个函数。我们只用到了add函数。 int add(int a,int b){ { return a+b; }} int subtract(int a,int b) { ...
  • 最近在项目开发过程中需要生成.so文件来给其他的程序调用,而我的这部分程序又需要调用其他的.so,这对于一个刚刚入职的程序猿来说着实有些令人着急,大致的项目需要如图,其中libStd.so是项目的标准库,和我的.so在...
  • 以下是.so库的生成及编译步骤: 如果.cpp文件不多的话,可以将.cpp和.hpp文件都放在一个目录,依次输入名称进行编译.也可以用指令将整个目录的.cpp文件全部编译.这里先记录依次输入名称的方法. 1.对目录不包含...
  • 总结的方向:在linux下php挂接mysql.so扩展的方法问题背景:平常我们都是先安装mysql,然后才能去安装php。假如先安装php,后安装mysql,由于php需要连接mysql,因而在php引擎中需要配置使用mysql.so扩展。这时需要...
  • 1、文件类型介绍 .out是可执行文件,相当于win上的exe;....so是共享库,用于动态链接,相当于win上.dll; 2、out可执行文件生成 main.cpp #include <stdio.h> int main() { printf("hello wor...
  • Linux下.so是基于Linux下的动态链接,其功能和作用类似与windows下.dll文件 一、引言 通常情况下,对函数库的链接是放在编译时期(compile)完成的。所有相关的对象文件(object file)与牵涉到的函数库(library)...
  • linux下安装python3.6.5并生成.so

    千次阅读 2020-09-10 10:32:25
    方法1:去别的环境有没 libpython3.6m.so.1.0,导过来加到共享库路径LD_LIBRARY_PATH,python版本需一样 vi ~/.bashrc export LD_LIBRARY_PATH=/usr/local/python36/lib/:$LD_LIBRARY_PATH 方法2:自己重新...
  • 在全新的linux下编译ffmeng源码,生成可用的.so和.h库。这次的文章非常重要,一定要自己编译出来,如果哪个地方出错了,重新来一下,一定要编译出.so库。这是因为很多c/c++库都编译和这次的编译都差不多。按照这篇...
  • linux下将.a文件链接到.so文件的问题

    千次阅读 2017-06-05 19:34:41
    linux下将.a文件链接到.so文件的问题 时间 2014-11-25 15:30:01 姜糖水 原文 http://www.cnphp6.com/archives/63743 主题 Linux 比如在链接lib123.a库生成libabc.so库时经常会遇到这个问题,当...
  • linux下.so文件

    2012-06-26 14:08:00
    linux下文件的类型是不依赖于其后缀名的,但一般来讲: .o,是目标文件,相当于windows中的.obj文件 .so 为共享库,是shared object,用于动态连接的,和dll差不多 .a为静态库,是好多个.o合在一起,用于静态连接 ....
  • linux下利用NDK生成.so文件

    千次阅读 2012-10-17 19:33:53
    我们在安装环境的时候安装了NDK,可以在eclipse直接生成so文件。NDK的压缩包里面自带了一些sample工程,NDK的文件直接解压到某个目录即可。 第一次生成so文件的时候,我们先使用NDK的sample的hello-jni的...
  • 最近因为阅读源码的工作,需要自己编译一些 .so 文件或者 .a 文件,查了一些资料,写了一些示例,记录一下。 静态库和动态库 一般程序编译的过程可以分为编译和链接两个阶段。链接阶段,需要把所有的obj文件(.o)...
  • rm -rf file //强制删除所有文件 rm -r file //对于大文件夹会出现?的提问 ...linux下include包含绝对路径,并且包含库文件很严格,例如在windows下包含即可使用printf,但是linux下必须包含 拷贝: cp
  • 静态库在linux环境中, 使用ar命令创建静态库文件.如下是命令的选项:d -----从指定的静态库文件中删除文件m -----把文件移动到指定的静态库文件中p -----把静态库文件中指定的文件输出到标准输出q -----快速地把文件...
  • 第一步,建立test.c #include<...第二步,在linux下编译.o和生成动态链接库.so gcc -fpic -c test.c (fpic的意思是Position Independent Code) gcc -shared -o libtest.so test.o 注意为什么叫...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,624
精华内容 649
关键字:

linux下生成.so

linux 订阅