linux 下编译c程序与动态链接库

1 动态库h文件和c文件

1.1 h 文件: kaflog4c.h

/**
 * kaflog4c.h
 */
#include <stdio.h>
#include <stdlib.h>

void hello(const char *msg);

1.2 c 文件: kaflog4c.c

/**
 * kaflog4c.c
 */
#include "kaflog4c.h"

void hello(const char *msg)
{
    printf("Hello %s!\n", msg);
}

2 编译要产生动态库和静态库

2.1 编译动态库:libkaflog4c.so

$ gcc -W -Wall -fPIC -ansi -pedantic -I. -c kaflog4c.c
$ gcc -shared kaflog4c.o -o libkaflog4c.so

2.2 编译静态库:libkaflog4c.a

$ ar r libkaflog4c.a kaflog4c.o

3 程序文件

3.1 main.c

编译要产生链接到动态库(libkaflog4c.so)的程序和静态库(libkaflog4c.a)的程序

/**
 * main.c
 */
#include "kaflog4c.h"

int main ()
{
    hello("cheungmine");
    return 0;
}

1) 编译链接到动态库libkaflog4c.so的测试程序main:

$ gcc -W -Wall -ansi -pedantic -I. -c main.c
$ gcc main.o -o main ./libkaflog4c.so

# 查看依赖
$ ldd ./main

# 运行
$ ./main

2) 编译链接到静态库libkaflog4c.a的测试程序main:

$ gcc main.o -o main ./libkaflog4c.a
$ ldd ./main

# 此时删除libkaflog4c.a和libkaflog4c.so对下面的执行无影响
$ ./main

3.2 main_dl.c

/**
 * main_dl.c
 */
#include "kaflog4c.h"

#include <dlfcn.h>

void dl_hello()
{
    void *dp;

    void (*fn_hello)(const char*);

    dp = dlopen("libkaflog4c.so", RTLD_LAZY);
    if (!dp) {
        printf("%s\n", dlerror());
        exit(1);
    }

    fn_hello = dlsym(dp, "hello");
    if (!fn_hello) {
        printf("%s\n", dlerror());
        exit(1);
    }

    fn_hello("cheungmine: load library when running");

    dlclose(dp);
}

int main()
{
    dl_hello();

    return 0;
}

编译运行时动态加载动态库libkaflog4c.so的程序

(libkaflog4c.so已经存在于当前目录下)

$ gcc -W -Wall -ansi -I. -c main_dl.c
$ gcc main_dl.o -o main_dl -ldl
$ ldd main_dl
$ ./main_dl

$ sudo mv ./libkaflog4c.so /usr/local/lib/
$ ./main_dl
libkaflog4c.so: cannot open shared object file: No such file or directory

$ sudo ldconfig
$ ./main_dl

linux 编译c程序与动态链接库的更多相关文章

  1. Linux编译安装程序(使用configure、make、 make install)

    以安装vim为例. (vim 是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面). 1.获取源文件 首先进入/usr/local下(只是为了方便处理安装文件,位置随意) 用git ...

  2. linux 编译win32程序

    apt-get install mingw32 int main(int argc, char *argv) { printf("Windows Compiler Test\n") ...

  3. Linux/Ubuntu下 静态编译Qt程序

    一般情况下,我们用Qt编译出来的程序是要依赖于系统Qt库的,也就是这个程序移到别的没有安装Qt库的系统上是不能使用的.会提示缺少……库文件之类的错误.这就是动态编译的结果. 但是如果我们想编译一个程序 ...

  4. Linux下静态编译Qt程序

    一般情况下,我们用Qt编译出来的程序是要依赖于系统Qt库的,也就是这个程序移到别的没有安装Qt库的系统上是不能使用的.会提示缺少……库文件之类的错误.这就是动态编译的结果. 但是如果我们想编译一个程序 ...

  5. Linux下C程序的编译,运行,及调试

    先查看linux有没有gcc 和 gdb $ gcc -v $ gdb -v 如果没有安装gcc,可以 $ yum install gcc 要获取管理员权限才能安装软件,$ su root (有的li ...

  6. Linux下C程序的编辑,编译和运行以及调试

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...

  7. [C++]Linux之Ubuntu下编译C程序出现错误:“ stray ‘\302'或者'\240' in program”的解决方案

    参考文献:[error: stray ‘\240’ in program或 error: stray ‘\302’ in program](http://blog.csdn.net/u01299585 ...

  8. Linux下通过源码编译安装程序(configure/make/make install的作用,然后在/etc/profile文件里修改PATH环境变量)

    一.程序的组成部分 Linux下程序大都是由以下几部分组成: 二进制文件:也就是可以运行的程序文件 库文件:就是通常我们见到的lib目录下的文件 配置文件:这个不必多说,都知道 帮助文档:通常是我们在 ...

  9. linux上应用程序的执行机制

    linux上应用程序的执行机制 执行文件是如何在shell中被"执行"的.本文中尽可能少用一些源码,免得太过于无 聊,主要讲清这个过程,感兴趣的同学可以去查看相应的源码了解更多的信 ...

随机推荐

  1. Cookie&Seesion会话 共享数据 工作流程 持久化 Servlet三个作用域 会话机制

    Day37 Cookie&Seesion会话 1.1.1 什么是cookie 当用户通过浏览器访问Web服务器时,服务器会给客户端发送一些信息,这些信息都保存在Cookie中.这样,当该浏览器 ...

  2. centos 7安装pycharm

    1.首先安装jdk: yum install java 结果: [root@controller bin]# java -version openjdk version "1.8.0_131 ...

  3. Spark技术内幕:Shuffle Read的整体流程

    回忆一下,每个Stage的上边界,要么需要从外部存储读取数据,要么需要读取上一个Stage的输出:而下边界,要么是需要写入本地文件系统(需要Shuffle),以供childStage读取,要么是最后一 ...

  4. Android Multimedia框架总结(四)MediaPlayer中从Java层到C++层类关系及prepare及之后其他过程

    转载请把头部出处链接和尾部二维码一起转载,本文出自:http://blog.csdn.net/hejjunlin/article/details/52420803 前言:在上篇中,分析了MediaPl ...

  5. ROS常用三維機器人仿真工具Gazebo教程匯總

    參考網址: 1. http://gazebosim.org/tutorials 2. http://gazebosim.org/tutorials/browse Gazebo Tutorials Ga ...

  6. ROS_Kinetic_27 在ROS中使用Cartographer进行SLAM

    ROS_Kinetic_27 在ROS中使用Cartographer进行SLAM Cartographer是谷歌新開源的通用的2D和3D定位與構圖同步的SLAM工具,並提供ROS接口. 论文Real- ...

  7. 4-sum问题

    给定一个整数数组,判断能否从中找出4个数a.b.c.d,使得他们的和为0,如果能,请找出所有满足和为0个4个数对. #define SIZE 10 void judgeAndPut(int* arr, ...

  8. Java基本语法-----java运算符

    这块的东西比较多 我写了太慢了 于是在word里写好贴出来供大家一起学习 运算符 -赋值运算符 -比较运算符 -逻辑运算符 -位运算符 -移位操作符 -三元运算符 [正在看本人博客的这位童鞋,我看你气 ...

  9. Android实现自动更新功能

    Android实现自动更新功能 Android自动更新的功能可以使用第三方的SDK来实现,但是类似友盟,就不支持x86手机的自动更新,科大讯飞,弹窗是全局的,小米手机就会默认把弹窗权限关掉不允许弹出提 ...

  10. Spark-1.6.0中的Sort Based Shuffle源码解读

    从Spark-1.2.0开始,Spark的Shuffle由Hash Based Shuffle升级成了Sort Based Shuffle.即Spark.shuffle.manager从Hash换成了 ...