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. centos 7 破解密码

    CentOS 7 root密码的重置方式和CentOS 6完全不一样,CentOS 7与之前的版本6变化还是比较大的,以进入单用户模式修改root密码为例. 1.重启开机按esc   2.按e     ...

  2. django之允许外部机器访问

    开开启django时,使用0.0.0.0:xxxx,作为ip和端口例如: python3 manage.py runserver 0.0.0.0:9000 然后在settings里修改ALLOWED_ ...

  3. Django网站制作

    创建mysite目录 django-admin.py startproject mysite这个命令作用是:这将创建在当前目录创建一个mysite目录 前提是从命令行上cd到你想储存你代码的目录,然后 ...

  4. JAVAEE——BOS物流项目11:在realm中授权、shiro的方法注解权限控制、shiro的标签权限控制、总结shiro的权限控制方式、权限管理

    1 学习计划 1.在realm中进行授权 2.使用shiro的方法注解方式权限控制 n 在spring文件中配置开启shiro注解支持 n 在Action方法上使用注解 3.★使用shiro的标签进行 ...

  5. Android自定义View(RollWeekView-炫酷的星期日期选择控件)

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/53420889 本文出自:[openXu的博客] 目录: 1分析 2定义控件布局 3定义Cus ...

  6. 有一个排序二叉树,数据类型是int型,如何找出中间大的元素。

    void tree2Dll(TNode* root, TNode*& tail) { if (!root) { return; } if (root->left) { tree2Dll( ...

  7. [OpenCV] How to install opencv by compiling source code

    Introduction Install OpenCV and its dependence ! STEPs 1, compiler sudo apt-get install build-essent ...

  8. 供应商导入的API补充(详解EBS接口开发之供应商导入)

    --供应商 --创建 AP_VENDOR_PUB_PKG.Create_Vendor ( p_api_version IN NUMBER, p_init_msg_list IN VARCHAR2 := ...

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

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

  10. 一个maven项目打多个可执行Jar文件

    使用maven-jar-plugin插件可以将一个maven项目按照需求打出多个可执行的jar文件. pom关键配置如下所示: <plugin> <groupId>org.ap ...