zoukankan      html  css  js  c++  java
  • Linux上制作可执行的共享库示例


    x.cpp为共享库libx.so的实现,b.cpp为可执行b的实现。

    x.cpp文件内容:

    #include <stdio.h>
    #include <stdlib.h>

    // 使用C++作为编译器

    void woo()
    {
        printf("woo\n");
    }

    // foo作为共享库的入口,必须为C函数
    extern "C" foo()
    {
        printf("foo\n");
        exit(0); // 请注意这里必须调用,否则输出foo后会有段错误
    }

    b.cpp文件内容:
    int main()
    {
        extern void woo();
        extern "C" void foo();
        
        woo();
        foo();
        
        return 0;
    }

    编译x.cpp为可执行的共享库:
    g++ -g -o libx.so -fPIE -pie -nostartfiles -Wl,-e,foo -rdynamic x.cpp
    -fPIE -pie是保证共享库可以执行,其中-fPIE编译参数,表示生成与位置无关的可执行代码(-fPIC只是生成与位置无关的非可执行代码),-pid是链接参数;-Wl,-e,foo指定共享库的入口函数,相当于可执行程序的main函数;如果没有-nostartfiles,则链接时会报main函数未定义;-rdynamic也是必须的,否则编译b.cpp时会报找不到foo定义;如需查看详细的编译链接过程,加上-v参数。请注意不能包含-shared参数,否则运行共享库时直接段错误。

    编译b.cpp为可执行文件:
    g++ -g -o b -L. -lx  b.cpp

    成功之后,libx.so和b都是可执行的了,其中libx.so的入口是foo,而b的入口是main函数。
  • 相关阅读:
    asp.net mvc 两级分类联动方法示例
    动手实践虚拟网络
    KVM 网络虚拟化基础
    LVM 类型的 Storage Pool
    KVM 存储虚拟化
    CPU 和内存虚拟化原理
    远程管理 KVM 虚机
    启动第一个 KVM 虚机
    准备 KVM 实验环境
    虚拟化
  • 原文地址:https://www.cnblogs.com/aquester/p/9891849.html
Copyright © 2011-2022 走看看