您的位置:首页 > 运维架构 > Linux

linux下如何编译自己的动态链接库

2016-11-14 20:22 330 查看
1 、如何用gcc 编译动态链接库(xxx.so)?

Step1、假设我们的工作目录为:shared_library

建立三个文件: foo.h foo.c main.c

foo.h 如下。

#ifndef foo_h__
#define foo_h__

extern void foo(void);

#endif  // foo_h__


foo.c

#include <stdio.h>

void foo(void)
{
puts("Hello, I'm a shared library");
}


main.c

#include <stdio.h>
#include "foo.h"

int main(void)
{
puts("This is a shared library test...");
foo();
return 0;
}


Notice : foo.h 是库的interface,foo.c 是implemention ,main.c 是库的调用者。

$gcc -c -Wall -Werror -fpic foo.c   // -c (compile)


parametersmeanings
-cinput是xxx.c output是.o
-Wall列出所有的warnings
-fpicPosition Independent Code
运行结果是:



Step 2、由object ⇒ share object

parametersmeanings
-ooutput

注意:gcc 假设所有的库都以‘lib’开始,同时以.so 或者.a: libxxx.so \libxxx.a

.so用于shared object /library,.a用于归档或静态链接库(archive, or statically linked libraries)



parametersmeanings
-Llocation: 就是告诉gcc去哪里找这个libxxx.so 或者libxxx.a
-l (lower case)link 注意与-c联系记忆 -c(compile) -l(link)编译连接
比如可以将L的参数写为绝对路径,或者相对路径:



Step3 、加入LD_LIBRARY_PATH

我们来运行:



error!这是因为,我们的共享库,并没有加入标准路径:/usr/lib or /usr/local/lib

当然,你可以把libfoo.so copy 到这个路径。也可以



这里我为了方便。你也可以把 “.” 换成 绝对路径。在执行



提示:我们用export这个指令固然省事。但是它实际上事不可以继承的。也就是假设你在某个shell单独执行这句话,那么这个变量仅仅在当前的shell起作用。其他的shell还是找不到这个库。

2、那问题来了:我怎么才能让我的所有的可执行程序都使用到这个动态链接库呢?

答:在~/目录下打开.bash_profile文件、或者是.bashrc,添加:



LD_LIBRARY_PATH 这个环境变量,它告诉loader:在哪些目录中可以找到共享库。可以设置多个搜索目录,这些目录之间用冒号分隔开。

一篇具有用的文章 https://cmake.org/Wiki/CMake_Useful_Variables

一篇具有用的文章 https://cmake.org/Wiki/CMake:How_To_Find_Libraries
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: