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中被"执行"的.本文中尽可能少用一些源码,免得太过于无 聊,主要讲清这个过程,感兴趣的同学可以去查看相应的源码了解更多的信 ...
随机推荐
- css3部分整理
1.css弹性盒子属性 父级元素属性的设置 #father{ width: 800px; height: 300px; background-color: darkgray; /*定义父级元素为弹性元 ...
- angular-cli学习笔记 快速创建代码模板
组件: ng g component component/demo 服务: ng g service service/news 然后在app.module.ts里引入 ng g service ser ...
- 使用 OpenCV 与 Face++ 人脸识别
今天看到一篇文章<使用 OpenCV 与 Face++ 实现人脸解锁>,感觉挺好玩,就照着作者的讲解,写了一下.详细内容还请看原作者文章. # *^_^* coding:utf-8 *^_ ...
- 【转】使用virtualenv在ubuntu上搭建python 3开发环境
ubuntu 13.04默认的python版本是2.7的,想在其上做python3的开发会遇到问题.比如要使用pip安装软件包时,默认安装的就是python2的包.如果想安装python3的包,就需要 ...
- [ Java学习基础 ] Java异常处理
一.异常概述 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的.比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error:如果你用Sys ...
- C语言关闭日志文件时忘了将日志文件全局变量指针置为NULL
C语言写了一个write_log函数以写日志,写了一个close_log_file函数以关闭日志,声明了一个日志文件全局变量文件指针plogFile. write_log中首先判断plogFile是否 ...
- Kirill And The Game CodeForces - 842A
CodeForces - 842A 需要将除法改换成乘法进行计算 #include<bits/stdc++.h> using namespace std; int main() { lon ...
- Android Studio: You need to use a Theme.AppCompat theme (or descendant) with this activity.
错误描述为: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with ...
- MacOS下对postgresql的简单管理操作
如何安装在另一篇blog中有述,这里不再赘述.本篇简单说一下安装完postgresql之后的一些管理和查询操作. 首先安装完postgresql之后需要初始化数据库: initdb /usr/loca ...
- [code segments] OpenCV3.0 SVM with C++ interface
talk is cheap, show you the code: /***************************************************************** ...