摘自http://blog.chinaunix.net/uid-23069658-id-3142046.html今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻。在这之前,我们需要了解一下源代码到可执行程序之间到底发生了什么神奇而美妙的事情。 在Linux操作系统中,普遍使用ELF格式作为可执行程序或者程序生成过程中的中间格式。ELF(Executable and Linking Format,可执行连接格式)是UNIX系统实验室(USL)作为应用程序二进制接口(Applicati...
一、linux操作系统支持的函数库分支 静态库:libxxx.a,在编译时就将库编译进可执行程序 优点:程序的运行环境中不需要外部的函数库 缺点:可执行程序大 动态库:又称共享库,libxxx.so,在程序运行时将库加载到可执行程序中 优点:可执行程序小 缺点:程序的运行环境中必须提供相应的库 函数库目录:/lib /usr/lib二、静态库的制作 ① 生成目标文件:gcc -c file.c ② 静态库的创...
前两天写了一个动态库,然后试图编译到程序里面去运行,结果发现编译的时候通过gcc的-L参数来指定路径仅仅能让编译通过,运行时还是会出问题的。比如下面这个例子:main.c是主程序,sum.c中间含有一个函数add,用来执行加法,代码如下: 1/* 2 * main.c3*/ 4 #include <stdio.h>5 6int add(int a, int b);7 8int main(int argc,char *argv[])9{
10 printf("sum = %d\n", add(3,5));
11return0;
12 } 1/*2 * sum.c
3*/4int add...
函数库分为静态库和动态库动态库(格式为libname.so[.主版本号.次版本号.发行号])。在程序编译时并不会被链接到目标代码中,而是在程序运行时才被载入。静态库是目标文件.a的归档文件(格式为libname.a)。如果在编译某个程序时链接静态库,则链接器将会搜索静态库并直接拷贝到该程序的可执行二进制文件到当前文件中;看定义不太好理解,下面举例说明上述概念:动态库动态库(格式为libname.so[.主版本号.次版本号.发行号])。在程...
linux 下的动态库制作 以及在python 中如何调用 c 函数库动态库:动态库又称动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL
还有助于共享数据和资源。多个应用程...
linux下添加动态链接库路径的方法2017年01月20日 10:08:17阅读数:5596
Linux共享库路径配置Linux下找不到共享库文件的典型现象为明明已经安装某个软包(如libnet,MySQL),编译连接可以正常进行,但是在运行时出现如“error while loading shared libraries: libnet.so.1:cannot open shared object file :No such file or directory”的错误提示。 原因是Linux下的共享库路径配置不正确。默认的linux共享库搜索路径为/lib和...
所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了宝贵的内存资源。.so文件是共享库文件(动态链接)。动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息),仅当应用程序被装入内存开始运行时,在操作系统的管理下,才在应用程序...
/usr/bin/ld: /usr/local/ssl/lib/libcrypto.a(x86_64cpuid.o): relocation R_X86_64_PC32 against `OPENSSL_cpuid_setup‘ can not be used when making a shared object; recompile with -fPIC
##g++编译动态库时,使用了ssl的静态库/usr/local/ssl/lib/libcrypto.a,结果一直报上面的错误用openssl0.9.8的的源码重新编译该库,还是报同样的错误,网上搜索了一番,发现正确的编译ssl的流程是./config -fPICmake make install由...
head.h#include<iostream>
void fun1();
void fun2();
void fun3();fun1.cpp#include "head.h"void fun1()
{std::cout<<"fun1"<<std::endl;
} fun2.cpp#include "head.h"void fun2()
{std::cout<<"fun2"<<std::endl;
} fun3.cpp#include "head.h"void fun3()
{std::cout<<"fun3"<<std::endl;
} main.cpp#include "head.h"int main()
{fun1();fun2();fun3();
} 将fun1.cpp,fun2.cpp,fun3.cpp生成目标文件g++ –c fun1.c fun2.c fun...
dlopen()是一个强大的库函数。该函数将打开一个新库,并把它装入内存。该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的。这种机制使得在系统中添加或者删除一个模块时,都不需要重新编译了。可以在自己的程序中使用 dlopen()。dlopen() 在 dlfcn.h 中定义,并在 dl 库中实现。它需要两个参数:一个文件名和一个标志。文件名就是一个动态库so文件,标志指明是否立刻计算库的依赖性。如果设置为 RTLD_NOW 的话,则立刻...
在生成动态库时,常常习惯性的加上fPIC选项,fPIC有什么作用和意义,加不加有什么区别,这里做下小结:fPIC的全称是 Position Independent Code, 用于生成位置无关代码。什么是位置无关代码,个人理解是代码无绝对跳转,跳转都为相对跳转。1、不加fPIC选项即使不加fPIC也可以生成.so文件,但是对于源文件有要求,例如因为不加fPIC编译的so必须要在加载到用户程序的地址空间时重定向所有表目,所以在它里面不能引用其它地方的代码如...
静态库
先说说我们为什么需要库?当有些代码我们大量会在程序中使用比如(scanf,printf等)这些函数我们需要在程序中频繁使用,于是我们就把这些代码编译为库文件,在需要使用时我们直接链接即可。定义:?程序在编译时把静态库的代码链接到可执行程序中,在代码运行时不再需要静态库。(简单理解就是把一堆 .o 文件打包到一起,当需要用到就让我们的程序链接进来)生成及使用方法:??这里用加减乘除来举例示意://创建所需文件
[r...
/*********************************************************************
* Author : Samson
* Date : 04/03/2014
* Test platform:
* Linux ubuntu 3.2.0-58-generic-pae
* GNU bash, version 4.2.39
* *******************************************************************/动态链接时、执行时搜索路径顺序:
1.编译目标代码时使用-L指定的动态库搜索路径;
2.环境变量LD_LIBRARY_PATH指定...
参考文章:http://blog.chinaunix.net/uid-23592843-id-223539.html 一、基本概念1.1什么是库在windows平台和linux平台下都大量存在着库。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。由于windows和linux的平台不同(主要是编译器、汇编器和连接器的不同),因此二者库的二进制是不兼容的。本文仅限于介绍linux下的库。 1.2库的种类linux下的库有两种:静态库和共享库(动态库)。二者的不同点在于代...
转载请注明出处:帘卷西风的专栏(http://blog.csdn.net/ljxfblog) zlib库是一个强大的通用的开源压缩库,用途比较广,在windows下能够很容易的编译或者拿到编译成功的二进制文件。但是linux下的比较少,本文记录一下如何编译。zlib官方网站:http://www.zlib.net首先,下载源码来安装zlib软件包。目前最新的版本是1.2.8。#wget http://www.zlib.net/zlib-1.2.8.tar.gz 然后,解压下载的文件包。#tar -xvf zlib-1.2.8.tar.gz#cd zib...