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
linux 编译c程序与动态链接库的更多相关文章
- Linux编译安装程序(使用configure、make、 make install)
以安装vim为例. (vim 是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面). 1.获取源文件 首先进入/usr/local下(只是为了方便处理安装文件,位置随意) 用git ...
- linux 编译win32程序
apt-get install mingw32 int main(int argc, char *argv) { printf("Windows Compiler Test\n") ...
- Linux/Ubuntu下 静态编译Qt程序
一般情况下,我们用Qt编译出来的程序是要依赖于系统Qt库的,也就是这个程序移到别的没有安装Qt库的系统上是不能使用的.会提示缺少……库文件之类的错误.这就是动态编译的结果. 但是如果我们想编译一个程序 ...
- Linux下静态编译Qt程序
一般情况下,我们用Qt编译出来的程序是要依赖于系统Qt库的,也就是这个程序移到别的没有安装Qt库的系统上是不能使用的.会提示缺少……库文件之类的错误.这就是动态编译的结果. 但是如果我们想编译一个程序 ...
- Linux下C程序的编译,运行,及调试
先查看linux有没有gcc 和 gdb $ gcc -v $ gdb -v 如果没有安装gcc,可以 $ yum install gcc 要获取管理员权限才能安装软件,$ su root (有的li ...
- Linux下C程序的编辑,编译和运行以及调试
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...
- [C++]Linux之Ubuntu下编译C程序出现错误:“ stray ‘\302'或者'\240' in program”的解决方案
参考文献:[error: stray ‘\240’ in program或 error: stray ‘\302’ in program](http://blog.csdn.net/u01299585 ...
- Linux下通过源码编译安装程序(configure/make/make install的作用,然后在/etc/profile文件里修改PATH环境变量)
一.程序的组成部分 Linux下程序大都是由以下几部分组成: 二进制文件:也就是可以运行的程序文件 库文件:就是通常我们见到的lib目录下的文件 配置文件:这个不必多说,都知道 帮助文档:通常是我们在 ...
- linux上应用程序的执行机制
linux上应用程序的执行机制 执行文件是如何在shell中被"执行"的.本文中尽可能少用一些源码,免得太过于无 聊,主要讲清这个过程,感兴趣的同学可以去查看相应的源码了解更多的信 ...
随机推荐
- 31. Next Permutation(中等,搞清楚啥是 next permutation)
Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...
- css文本超出省略号
终于完成了项目了,今天我就分享自己在项目中比较实用的一些功能的实现,第一个就是纯css文本超出省略号 /* 文本单行超出省略号 */ .textels { overflow: hidden; text ...
- bootstrap table 和 x-editable 使用方法
最近需要做一些数据表格,有同事推荐EasyUI,但经过比较还是选择了Bootstrap,一款极为强大的表格组件,基于Bootstrap 的 jQuery .本文还将介绍Bootstrap-editab ...
- Luogu P3919 【模板】可持久化数组 可持久化线段树
其实就是可持久化线段树的模板题线段树不会看这里 #include<bits/stdc++.h> ; using namespace std; ]; ],rc[N*],val[N*],cnt ...
- scan函数用法详解
scan函数: scan(s,n,"char")表示从字串string中以char为分隔符提取第n个字串 功能(function):从字符表达式s中搜取给定的n个单词语法(synt ...
- 利用Bioperl的SeqIO模块解析fastq文件
测序数据中经常会接触到fastq格式的文件,比如说拿到fastq格式的原始数据后希望查看测序碱基的质量并去除低质量碱基.一般而言大家都是用现有的工具,比如说fastqc这个Java写的小程序,确实很好 ...
- Hibernate之SchemaExport的使用
@Test public void testCreateDB(){ Configuration cfg = new Configuration().configure(); SchemaExport ...
- Dynamics CRM 产品视图列上自带按钮的隐藏
CRM中对command bar的处理都是使用ribbon workbench,但是很多系统自带的按钮你是没法在ribbon workbench看到的,咱们以产品为例,比如我要隐藏form上的保存按钮 ...
- RunLoop总结:RunLoop的应用场景(三)
今天要讲的RunLoop的应用场景可能太简单了,所以东西比较少.因为跟UITableView.UICollectionView等的滑动优化有关,就顺便总结一下会影响UITableView.UIColl ...
- Swift完成fizz buzz test
看到一篇文章上说,很多貌似看过很多本编程书的童鞋连简单的fizz buzz测试都完不成. 不知道fizz buzz test为何物的,建议自行搜之. 测试要求是,编写满足以下条件的代码: Write ...