cmake中设置ELF文件加载动态库的位置
简单工程示例
1. world.c
#include<stdio.h>
void world(void)
{
printf("world.\n");
}
2. hello.c
#include <stdio.h> void world(void);
void hello(void)
{
printf("hello\n");
world();
}
3. main.c
void main(void)
{
hello();
}
2. 编译动态库
gcc -c -fPIC hello.c world.c
gcc -shared -o libworld.so world.o
gcc -shared -o libhello.so hello.o -lworld -L .
可见动态库libhello.so依赖于libworld.so
3. CMakeLists.txt
cmake_minimum_required(VERSION 3.2)
PROJECT(pro) SET(CMAKE_BUILD_TYPE Release) SET(LINK_PATH .)
SET(LINK_PATH . ) INCLUDE_DIRECTORIES(${INCLUDE_PATH})
LINK_DIRECTORIES(${LINK_PATH}) ADD_EXECUTABLE(main main.c)
TARGET_LINK_LIBRARIES(main hello world)
这种方式生成的main ELF文件的默认动态库搜索路径是当前文件夹 ".";一旦当前文件夹下动态库不存在则找不到动态库,无法执行。此时可以通过设置 LD_LIBRARY_PATH 方式帮助ELF文件在相对应路径下查找动态库或者
cmake_minimum_required(VERSION 3.2)
PROJECT(pro) SET(CMAKE_BUILD_TYPE Release) SET(LINK_PATH .)
SET(LINK_PATH . ) INCLUDE_DIRECTORIES(${INCLUDE_PATH})
LINK_DIRECTORIES(${LINK_PATH}) LINK_LIBRARIES(hello world -Wl,-rpath=/usr/local/lib)
ADD_EXECUTABLE(main main.c)
或者方案二
cmake_minimum_required(VERSION 3.2)
PROJECT(pro) SET(CMAKE_BUILD_TYPE Release) SET(LINK_PATH .)
SET(LINK_PATH . /usr/local/lib) INCLUDE_DIRECTORIES(${INCLUDE_PATH})
LINK_DIRECTORIES(${LINK_PATH}) ADD_EXECUTABLE(main main.c)
TARGET_LINK_LIBRARIES(main hello world)
或者方案三
cmake_minimum_required(VERSION 3.2)
PROJECT(pro) SET(CMAKE_BUILD_TYPE Release) SET(LINK_PATH .)
SET(LINK_PATH . ) INCLUDE_DIRECTORIES(${INCLUDE_PATH})
LINK_DIRECTORIES(${LINK_PATH}) SET(CMAKE_EXE_LINKER_FLAGS '-Wl,-rpath=/usr/local/lib')
LINK_LIBRARIES(hello world)
ADD_EXECUTABLE(main main.c)
通过设置连接参数,将/usr/local/lib和当前文件夹路径写入到ELF文件内,则每次ELF将在/usr/local/lib路径下查找可执行文件
cmake中设置ELF文件加载动态库的位置的更多相关文章
- ELF文件加载与动态链接(一)
关于ELF文件的详细介绍,推荐阅读: ELF文件格式分析 —— 滕启明.ELF文件由ELF头部.程序头部表.节区头部表以及节区4部分组成. 通过objdump工具和readelf工具,可以观察ELF文 ...
- Linux下c函数dlopen实现加载动态库so文件代码举例
dlopen()是一个强大的库函数.该函数将打开一个新库,并把它装入内存.该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的.这种机制使得在系统中添加或者删除一个模块时,都不需要重新编译了. ...
- 【转载】cocos2dx 中 Android NDK 加载动态库的问题
原文地址:http://blog.csdn.net/sozell/article/details/10551309 cocos2dx 中 Android NDK 加载动态库的问题 闲聊 最近在接入各 ...
- Windows平台LoadLibrary加载动态库搜索路径的问题
一.背景 在给Adobe Premiere/After Effects等后期制作软件开发第三方插件的时候,我们总希望插件依赖的动态库能够脱离插件的位置,单独存储到另外一个地方.这样一方面可以与其他程序 ...
- LoadLibrary加载动态库失败
[1]LoadLibrary加载动态库失败的可能原因以及解决方案: (1)dll动态库文件路径不对.此场景细分为以下几种情况: 1.1 文件路径的确错误.比如:本来欲加载的是A文件夹下的动态库a.dl ...
- QLibrary 加载动态库
阅读本文大概需要 6.6分钟 一般情况下在没有头文件支持情况下,想要引入某个动态库,最好的办法就是使用「动态加载」的方法,在Qt中一般使用QLibyary来操作 常用 api QLibrary(con ...
- QT常用代码之加载动态库和弹出对话框
作者:朱金灿 来源:http://blog.csdn.net/clever101 加载动态库的代码: typedef void (*Execute)(); // 定义导出函数类型 QString st ...
- ELF文件加载与动态链接(二)
GOT应该保存的是puts函数的绝对虚地址,这里为什么保存的却是puts@plt的第二条指令呢? 原来“解释器”将动态库载入内存后,并没有直接将函数地址更新到GOT表中,而是在函数第一次被调用时,才会 ...
- IDEA中Springboot静态文件加载(热部署)
Springboot项目静态文件加载 昨天写项目的时候碰到一个问题,就是静态文件css无法读取到项目中,我仔细思考了下,总结了下,可能有两个问题 1.页面未加载更新 这个可能性非常大,Chrome就是 ...
随机推荐
- SFTP服务器使用指南(1)——安装搭建freeSSHd
为什么选择freeSSHd 此软件免费 功能非常丰富且强大,同时支持软件用户.本地系统用户和域用户验证 对各用户选择性开放SFTP,Telnet, Tunneling服务 功能和服务完全不受限制的使用 ...
- Linux中几个实用快捷键
返回上层目录: cd .. 命令提示符: user@ubuntu: @之前的部分为当前用户ID名称: @之后冒号之前是主机名称 sudo :(Superusers Do) 以超级用户执行 在相对路径 ...
- ICE的Glacier2使用
1.使用Glacier2的步骤: A.编写一个Glacier2的配置文件,参见样例 B.设置Glacier2的访问鉴权(密码或者证书),passwords文件每行样例"test xx ...
- POJ - 2891 Strange Way to Express Integers (扩展中国剩余定理)
题目链接 扩展CRT模板题,原理及证明见传送门(引用) #include<cstdio> #include<algorithm> using namespace std; ty ...
- [HDU5324]Boring Class
vjudge sol 字典序最小可以通过倒着\(dp\)解决.对每个\(i\)记录它可以转移到的\(dp\)值最大且字典序最小的\(nxt_i\). 尝试着写一下\(dp\)式子. \[dp_i=ma ...
- 【java规则引擎】之规则引擎解释
转载:http://www.open-open.com/lib/view/open1417528754230.html 现实生活中,规则无处不在.法律.法规和各种制度均是:对于企业级应用来说,在IT技 ...
- Genymotion的使用 -- A Faster Android Emulator
Genymotion 安装与配置 1,Genymotion 模拟器 EditText获取焦点时不自动弹出软件盘 选择该模拟器的设置--> 选中Use Virtual keyboard for t ...
- secret CRT 会话光标不闪烁问题
点击 选项->会话选项 然后在取消即可,就有了闪烁的光标,应该是个bug.
- hihoCoder#1067(离线算法求LCA)
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上上回说到,小Hi和小Ho用非常拙劣——或者说粗糙的手段山寨出了一个神奇的网站,这个网站可以计算出某两个人的所有共同祖先中 ...
- Lib之过?Java反序列化漏洞通用利用分析
转http://blog.chaitin.com/ 1 背景 2 Java反序列化漏洞简介 3 利用Apache Commons Collections实现远程代码执行 4 漏洞利用实例 4.1 利用 ...