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

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-13 22:54:34

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

linux 编译win32程序

apt-get install mingw32 int main(int argc, char *argv) { printf("Windows Compiler Test\n"); return 0; } i586-mingw32msvc-gcc -o win32.exe main.c

Linux下静态编译Qt程序

一般情况下,我们用Qt编译出来的程序是要依赖于系统Qt库的,也就是这个程序移到别的没有安装Qt库的系统上是不能使用的.会提示缺少……库文件之类的错误.这就是动态编译的结果. 但是如果我们想编译一个程序,这个程序在发给别人后,他们可以直接打开,而不需要特别地去先安装Qt库,那就需要采用静态编译了. 在Linux下如何静态编译Qt程序呢? 首先需要先安装静态编译的Qt,也就是静态编译Qt程序首先是需要一个静态编译安装的Qt   1.下载源安装程序,如 qt-x11-opensource-src-4.

在linux下如何编译C++程序

一.GCC(GNU Compiler Collection)是linux下最主要的编译工具,GCC不仅功能非常强大,结构也异常灵活.它可以通过不同的前端模块来支持各种语言,如Java.Fortran.Pascal.Modula-3和Ada g++是GCC中的一个工具,专门来编译C++语言的. GCC的参数有:( 也是分步实现) -E  让GCC在预处理结束后停止编译  g++ -E hello.cpp  -o  hello.i -c  将hello.i编译成目标代码 g++  -c  hello

Linux下通过源码编译安装程序

ASK: Linux下通过源码编译安装程序(configure/make/make install的作用) configure Linux 平台有各种不同的配置,安装时需要通过 configure 来确定,如:编译器用的是 cc 还是 gcc.不同库文件所在目录等.执行 configure 后会生成 Makefile,Makefile 规定了用什么编译器.编译参数等信息. make 根据 Makefile 中规定的内容进行编译,生成的可执行文件放在当前目录或某个子目录. make install

linux中codeblocks程序编译运行后不出现控制台窗口

系统: CentOS 6.4 CodeBlocks 13.12 64bit 现象: 在codeblocks中新建了一个控制台程序,是最简单的“Hello,world”,但是程序编译后,点击运行按钮时不出现控制台窗口,但是在linux终端下,跳转到程序目录,就可以执行编译的程序. 错误:process terminated with status 255 解决: yum install xterm

linux下编译httpd程序

编译httpd程序 使用的程序包 httpd-2.4.25.tar.bz2 环境 Centos7 一: 先用tar工具解压程序包.    二:解压后在目录下可以看到程序包里的文件,我们重点关注的是Makefile.in的模板文件,还有README程序说明文件,以及INSTALL编译方法文件不会编译可以看看里面的说明步骤. 绿色的configure是一个可执行文件.    三: 设置好选项就可以开始了,这里我只设置了安装路径,其他的可按需添加    四:由于是第一次安装,不知道会缺少说明依赖包,我

[C] linux静态链接库与动态链接库详解

http://blog.chinaunix.net/u2/76292/showart.php?id=1274181 一顺便说说了哦  通常情况下,对函数库的链接是放在编译时期(compile time)完成的.所有相关的对象文件(object file)与牵涉到的函数库(library)被链接合成一个可执行文件(executable file).程序在运行时,与函数库再无瓜葛,因为所有需要的函数已拷贝到自己门下.所以这些函数库被成为静态库(static libaray),通常文件名为"libxx

linux试验——SET-UID程序漏洞实验

SET-UID程序漏洞实验 20125121 一.实验描述 Set-UID 是Unix系统中的一个重要的安全机制.当一个Set-UID程序运行的时候,它被假设为具有拥有者的权限.例如,如果程序的拥有者是root,那么任何人运行这个程序时都会获得程序拥有者的权限.Set-UID允许我们做许多很有趣的事情,但是不幸的是,它也是很多坏事情的罪魁祸首. 二.实验内容 2.1 猜测为什么“passwd”,“chsh”,“su”,和“sudo”命令需要Set-UID机制,如果它们没有这些机制的话,会发生什么

Linux编译多个不同目录下的文件以及静态库、动态库的使用

先看两篇博文,作为基础知识.如果对C/C++编译链接过程都了解的话,可以跳过不看. http://www.firedragonpzy.com.cn/index.php/archives/2556 http://www.cppblog.com/shifan3/archive/2007/01/05/17325.html 一.  编译不同目录下的多个文件 各个文件的布局如下: head.h文件的代码: [cpp] view plaincopy #ifndef  HEAD_H #define  HEAD