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. 31. Next Permutation(中等,搞清楚啥是 next permutation)

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

  2. css文本超出省略号

    终于完成了项目了,今天我就分享自己在项目中比较实用的一些功能的实现,第一个就是纯css文本超出省略号 /* 文本单行超出省略号 */ .textels { overflow: hidden; text ...

  3. bootstrap table 和 x-editable 使用方法

    最近需要做一些数据表格,有同事推荐EasyUI,但经过比较还是选择了Bootstrap,一款极为强大的表格组件,基于Bootstrap 的 jQuery .本文还将介绍Bootstrap-editab ...

  4. Luogu P3919 【模板】可持久化数组 可持久化线段树

    其实就是可持久化线段树的模板题线段树不会看这里 #include<bits/stdc++.h> ; using namespace std; ]; ],rc[N*],val[N*],cnt ...

  5. scan函数用法详解

    scan函数: scan(s,n,"char")表示从字串string中以char为分隔符提取第n个字串 功能(function):从字符表达式s中搜取给定的n个单词语法(synt ...

  6. 利用Bioperl的SeqIO模块解析fastq文件

    测序数据中经常会接触到fastq格式的文件,比如说拿到fastq格式的原始数据后希望查看测序碱基的质量并去除低质量碱基.一般而言大家都是用现有的工具,比如说fastqc这个Java写的小程序,确实很好 ...

  7. Hibernate之SchemaExport的使用

    @Test public void testCreateDB(){ Configuration cfg = new Configuration().configure(); SchemaExport ...

  8. Dynamics CRM 产品视图列上自带按钮的隐藏

    CRM中对command bar的处理都是使用ribbon workbench,但是很多系统自带的按钮你是没法在ribbon workbench看到的,咱们以产品为例,比如我要隐藏form上的保存按钮 ...

  9. RunLoop总结:RunLoop的应用场景(三)

    今天要讲的RunLoop的应用场景可能太简单了,所以东西比较少.因为跟UITableView.UICollectionView等的滑动优化有关,就顺便总结一下会影响UITableView.UIColl ...

  10. Swift完成fizz buzz test

    看到一篇文章上说,很多貌似看过很多本编程书的童鞋连简单的fizz buzz测试都完不成. 不知道fizz buzz test为何物的,建议自行搜之. 测试要求是,编写满足以下条件的代码: Write ...