linux下如何编译自己的动态链接库
2016-11-14 20:22
330 查看
1 、如何用gcc 编译动态链接库(xxx.so)?
foo.h 如下。
foo.c
main.c
Notice : foo.h 是库的interface,foo.c 是implemention ,main.c 是库的调用者。
运行结果是:
![](http://img.blog.csdn.net/20161114192822695)
注意:gcc 假设所有的库都以‘lib’开始,同时以.so 或者.a: libxxx.so \libxxx.a
.so用于shared object /library,.a用于归档或静态链接库(archive, or statically linked libraries)
![](http://img.blog.csdn.net/20161114194613554)
比如可以将L的参数写为绝对路径,或者相对路径:
![](http://img.blog.csdn.net/20161114200616823)
![](http://img.blog.csdn.net/20161114200714192)
error!这是因为,我们的共享库,并没有加入标准路径:/usr/lib or /usr/local/lib
当然,你可以把libfoo.so copy 到这个路径。也可以
![](http://img.blog.csdn.net/20161114201513061)
这里我为了方便。你也可以把 “.” 换成 绝对路径。在执行
![](http://img.blog.csdn.net/20161114201704358)
提示:我们用export这个指令固然省事。但是它实际上事不可以继承的。也就是假设你在某个shell单独执行这句话,那么这个变量仅仅在当前的shell起作用。其他的shell还是找不到这个库。
2、那问题来了:我怎么才能让我的所有的可执行程序都使用到这个动态链接库呢?
答:在~/目录下打开.bash_profile文件、或者是.bashrc,添加:
![](http://img.blog.csdn.net/20161114203725356)
LD_LIBRARY_PATH 这个环境变量,它告诉loader:在哪些目录中可以找到共享库。可以设置多个搜索目录,这些目录之间用冒号分隔开。
一篇具有用的文章 https://cmake.org/Wiki/CMake_Useful_Variables
一篇具有用的文章 https://cmake.org/Wiki/CMake:How_To_Find_Libraries
Step1、假设我们的工作目录为:shared_library
建立三个文件: foo.h foo.c main.cfoo.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)
parameters | meanings |
---|---|
-c | input是xxx.c output是.o |
-Wall | 列出所有的warnings |
-fpic | Position Independent Code |
Step 2、由object ⇒ share object
parameters | meanings |
---|---|
-o | output |
.so用于shared object /library,.a用于归档或静态链接库(archive, or statically linked libraries)
parameters | meanings |
---|---|
-L | location: 就是告诉gcc去哪里找这个libxxx.so 或者libxxx.a |
-l (lower case) | link 注意与-c联系记忆 -c(compile) -l(link)编译连接 |
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
相关文章推荐
- Linux下编译使用自己的动态链接库-详解
- 如何让自己的动态链接库文件能够在linux下被调用
- 如何将arm-linux-gcc编译的动态链接helloworld在Android上运行
- 嵌入式 Linux下GCC编译时如何指定链接库
- Linux下编译出来的动态链接库缺少so后缀的问题解决
- Linux下如何自己编译源代码(制作成可以安装的.deb文件)
- Linux下GCC 编译时如何指定链接库
- (转)如何让一个动态链接库文件debug和release编译的时候生成不同的文件名
- linux下编译动态链接库
- linux动态链接共享库(如何解决应用程序跑不起来not found等问题)
- Linux下GCC 编译时为什么要指定链接库?如何指定链接库 ?
- 如何自己配置和编译一个完整的Linux嵌入式开发环境?
- 在linux下如何制作自己的动态连接库
- 自己在linux上编译、链接、动态库和静态库的学习笔记
- Qt在Linux环境下如何进行动态链接(i.e. Caffe+Qt)
- 【转】如何在_Linux_下调试动态链接库
- C++ 在 Linux下编译动态链接库
- 【转】C#生成dll文件:如何用C#编译生成dll文件即动态链接库文件供其它程序调用
- linux x86下依赖于动态链接库so的cpp程序编译
- 如何让一个动态链接库文件debug和release编译的时候生成不同的文件名