简单工程示例

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文件加载动态库的位置的更多相关文章

  1. ELF文件加载与动态链接(一)

    关于ELF文件的详细介绍,推荐阅读: ELF文件格式分析 —— 滕启明.ELF文件由ELF头部.程序头部表.节区头部表以及节区4部分组成. 通过objdump工具和readelf工具,可以观察ELF文 ...

  2. Linux下c函数dlopen实现加载动态库so文件代码举例

    dlopen()是一个强大的库函数.该函数将打开一个新库,并把它装入内存.该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的.这种机制使得在系统中添加或者删除一个模块时,都不需要重新编译了. ...

  3. 【转载】cocos2dx 中 Android NDK 加载动态库的问题

     原文地址:http://blog.csdn.net/sozell/article/details/10551309 cocos2dx 中 Android NDK 加载动态库的问题 闲聊 最近在接入各 ...

  4. Windows平台LoadLibrary加载动态库搜索路径的问题

    一.背景 在给Adobe Premiere/After Effects等后期制作软件开发第三方插件的时候,我们总希望插件依赖的动态库能够脱离插件的位置,单独存储到另外一个地方.这样一方面可以与其他程序 ...

  5. LoadLibrary加载动态库失败

    [1]LoadLibrary加载动态库失败的可能原因以及解决方案: (1)dll动态库文件路径不对.此场景细分为以下几种情况: 1.1 文件路径的确错误.比如:本来欲加载的是A文件夹下的动态库a.dl ...

  6. QLibrary 加载动态库

    阅读本文大概需要 6.6分钟 一般情况下在没有头文件支持情况下,想要引入某个动态库,最好的办法就是使用「动态加载」的方法,在Qt中一般使用QLibyary来操作 常用 api QLibrary(con ...

  7. QT常用代码之加载动态库和弹出对话框

    作者:朱金灿 来源:http://blog.csdn.net/clever101 加载动态库的代码: typedef void (*Execute)(); // 定义导出函数类型 QString st ...

  8. ELF文件加载与动态链接(二)

    GOT应该保存的是puts函数的绝对虚地址,这里为什么保存的却是puts@plt的第二条指令呢? 原来“解释器”将动态库载入内存后,并没有直接将函数地址更新到GOT表中,而是在函数第一次被调用时,才会 ...

  9. IDEA中Springboot静态文件加载(热部署)

    Springboot项目静态文件加载 昨天写项目的时候碰到一个问题,就是静态文件css无法读取到项目中,我仔细思考了下,总结了下,可能有两个问题 1.页面未加载更新 这个可能性非常大,Chrome就是 ...

随机推荐

  1. this license has been cancelled

    是因为IDEA注册码的问题, 解决方案: 修改此路径的hosts文件:C:\Windows\System32\drivers\etc\hosts 在其最后一行加入:“0.0.0.0 account.j ...

  2. ie-9 以下ajax无法跨域的问题。只要add:jQuery.support.cors=true;即可

    if (!jQuery.support.cors && window.XDomainRequest) { var httpRegEx = /^https?:\/\//i; var ge ...

  3. 整理下PC和移动获取点击、移动坐标的代码和坑

    一.PC PC是通过鼠标点击和移动,相对比较简单,比如onmousedown.onmouseup.onmousemove.onmouseout鼠标按键按下.按键起来.鼠标在元素上移动.鼠标从元素上离开 ...

  4. 线程存储(Thread Specific Data)

    线程中特有的线程存储, Thread Specific Data .线程存储有什么用了?他是什么意思了? 大家都知道,在多线程程序中,所有线程共享程序中的变量.现在有一全局变量,所有线程都可以使用它, ...

  5. (转)Linux sort命令

    Linux 的 ‘sort’命令的14个有用的范例(一) 2015-5-2 10:29    评论: 3 收藏: 10 编译自:http://www.tecmint.com/sort-command- ...

  6. python exec内置表达式--exec()

    exec obj功能: exec 执行储存在字符串或文件中的Python语句,相比于 eval,exec可以执行更复杂的 Python 代码.obj 是 要执行的表达式.exec 返回值永远为 Non ...

  7. Mysql事件的创建和使用

    1.查看事件是否开启SHOW VARIABLES LIKE 'event_scheduler'; 2.开启事件SET GLOBAL event_scheduler = ON; 3.创建事件DELIMI ...

  8. 设置Nodejs NPM全局路径

    Windows下的Nodejs npm路径是appdata 在nodejs的安装目录中找到node_modules\npm\.npmrc文件 修改如下即可: prefix = E:\nodejs\np ...

  9. 用反射封装HttpHandler,实现通过action方法名调用方法

    using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using Sy ...

  10. Java-API:javax.servlet.http.HttpServletResponse

    ylbtech-Java-API:javax.servlet.http.HttpServletResponse 1.返回顶部 1. javax.servlet.http Interface HttpS ...