• linux下动态链接库解决方案(二)


    以前写过一个关于linux下用c++写动态链接库无法通过的解决方案,今天看到《linux C程序设计-王者归来》这本书,书中有个更容易的解决方案,特此记录下来

    书中使用的是c语言,我改用c++试了一下,依旧可以运行:

    先来写动态库文件:

    //lib.cpp
    1
    int add(int a,int b) 2 { 3 return a+b; 4 } 5

    (*前面写过一个复杂的,这次就简单些举个例子吧*)

    书中运用了导出外部函数的做法,先写了一个使用库函数的头文件

    //lib.h
    extern int add(int,int);

    然后写调用函数的main函数

    //main.cpp
    #include<iostream> #include"lib.h" using namespace std; int main() { int a=5; int b=6; int c; c=add(a,b); cout<<c<<endl; return 0; }

    (*注意,这里并没有包含dlfcn.h头文件,也就是并没有使用linux系统库函数来调用动态链接库)

    下面就是编译方法的问题了:

    对lib.cpp文件使用命令:

    g++ -shared -fPIC -o lib.so lib.cpp

    执行完成后会得到lib.so文件

    下面这一步很重要,要对main.cpp进行编译,执行命令:

    g++ main.cpp ./lib.so -o main

    (*这里也不实用-ldl操作符来限定)

    会自动生成main文件,你去执行一下这个文件,就会发现库函数已经被执行了,比起调用系统调用和extern “C”去消除重载要简单了很多。

    (**补充**)

    我对比了一下两种方式编译出来的文件(方法一参见博客同分类下的《linux下动态链接库解决方案(一)》)

    上图中,代表号2的都是上一次那种方式编译出来的文件,会发现:

    本次方式编译出的文件,可执行文件(main相比于main2)较小,而动态链接库文件(lib.so相比于lib2.so)则稍大

    通过对比,我个人还是建议使用本次方式编译文件,虽然 编译出来的动态库文件稍大(其实大不了多少),但编译出来的可执行文件就远远小于上一次提出的方式了。

    整体看来还是这种方式简单……

  • 相关阅读:
    css介绍与引入
    [K/3Cloud] 单据转换插件执行顺序
    [K/3Cloud] 如何设置设置单据分录中的整列的精度
    [K/3Cloud] 单据新增、复制、新增行、复制行的过程
    [K/3Cloud] 代码中设置某个字段必录
    [K/3Cloud] 创建一个业务单据表单插件
    [K/3Cloud] 创建一个单据转换插件
    [K/3Cloud] 创建一个操作校验器
    [K3Cloud] QueryService使用注意事项
    [K/3Cloud] 树形单据体的应用说明
  • 原文地址:https://www.cnblogs.com/zlgxzswjy/p/5436483.html
Copyright © 2020-2023  润新知