cmake中设置ELF文件加载动态库的位置

1. 三个文件

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(CMAKE_EXE_LINKER_FLAGS ‘-Wl,-rpath=/usr/local/lib‘)

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)

通过设置连接参数,将/usr/local/lib路径写入到ELF文件内,则每次ELF将在/usr/local/lib路径下查找可执行文件

时间: 2024-11-01 01:13:27

cmake中设置ELF文件加载动态库的位置的相关文章

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

ELF格式文件简单介绍 关于ELF文件的详细介绍,推荐阅读: ELF文件格式分析 —— 滕启明.ELF文件由ELF头部.程序头部表.节区头部表以及节区4部分组成. 通过objdump工具和readelf工具,可以观察ELF文件详细信息. ELF文件加载过程分析 从编译.链接和运行的角度,应用程序和库程序的链接有两种方式.一种是静态链接,库程序的二进制代码链接进应用程序的映像中:一种是动态链接,库函数的代码不放入应用程序映像,而是在启动时,将库程序的映像加载到应用程序进程空间. 在动态链接中,GN

Ubuntu linux设置从当前目录下加载动态库so文件

linux的excutable在执行的时候缺省是先搜索/lib和/usr/lib这两个目录,然后按照ld.so.conf里面的配置搜索绝对路径,linux缺省是不会在当前目录搜索动态库的.windows加载动态库的时候,缺省是首先加载本地目录下的动态库,然后再搜索windows/system和windows/system32目录. windows的动态库搜索顺序,虽然有可能会造成潜在的混乱,但是对于开发和测试无疑是比较方便的,尤其是debug和release版本的动态库需要经常切换进行测试的时候

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

dlopen()是一个强大的库函数.该函数将打开一个新库,并把它装入内存.该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的.这种机制使得在系统中添加或者删除一个模块时,都不需要重新编译了.可以在自己的程序中使用 dlopen().dlopen() 在 dlfcn.h 中定义,并在 dl 库中实现.它需要两个参数:一个文件名和一个标志.文件名就是一个动态库so文件,标志指明是否立刻计算库的依赖性.如果设置为 RTLD_NOW 的话,则立刻计算:如果设置的是 RTLD_LAZY,则在需要

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

原文地址:http://blog.csdn.net/sozell/article/details/10551309 cocos2dx 中 Android NDK 加载动态库的问题 闲聊 最近在接入各个平台的SDK,遇到了不少问题,也从中了解了不少知识,之前一直觉得没啥好写的,毕竟做了4个月的游戏开发,也没有碰上什么真正的大问题,cocos2dx的引擎包得也很好,能让人把大部分时间都关注在游戏逻辑.效果的处理上,当然,之前的libevent还是小坑一下,但是和后来遇到的相比,也算不上什么了. 我最

LoadLibrary加载动态库失败

LoadLibrary加载动态库失败的可能原因以及解决方案: (1)dll动态库文件路径不对.此场景细分为以下几种情况: 1.1 文件路径的确错误.比如:本来欲加载的是A文件夹下的动态库a.dll,但是经过仔细排查原因,发现a.dll动态库竟然被拷贝到B文件夹下去了. 若真遇到这种低级错误,建议你找个没人的墙角蹲下用小拇指逆时针划圈圈去吧... 1.2 实参传值错误.比如:实参类型为LPCWTR,经常都会因为字符串转换导致实参事与愿违. 网上的经验总结实例.某程序员经过一番周折后通过以下语句调用

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

GOT应该保存的是puts函数的绝对虚地址,这里为什么保存的却是[email protected]的第二条指令呢? 原来“解释器”将动态库载入内存后,并没有直接将函数地址更新到GOT表中,而是在函数第一次被调用时,才会进行函数地址的重定位,这样做的好处是可以加快程序加载速度,尤其对大型程序来说.有关这方面的更详细的信息,可以搜索“动态链接库的延迟绑定技术”. 继续看第二条指令,pushq $0x0代表什么? 查看Hello world程序的重定位节: [email protected]:~/wo

macOS下加载动态库dylib报&quot;code signature invalid&quot;错误的解决办法

一.现象描述 在macOS上搞开发也有一段时间了,也积攒了一定的经验.然而,今天在替换工程中的一个动态库时还是碰到了一个问题.原来工程中用的是一个静态库,调试时发现有问题就把它替换成了动态库.这本来没什么值得一说,可工程编译完后打包测试时发现,不论怎么搞程序都加载不起来.毫无疑问,这是新替换的动态库带来的问题. 二.解决办法 于是尝试打开日志文件看看有什么发现吧: 根据上面的日志文件提示,动态库加载的时候失败了.原因为:code signature invalid.这就奇了个怪了,以前都没碰到类

IDEA导入maven工程以及web.xml中spring配置文件文件加载不到的问题

使用idea导入maven工程,工程只留了src和pom.xml文件 1.从打开idea中导入:File ----> New -----> Project from Existing Sources.如下图: 2.选择你所要导入的项目.点击ok 3.一定要选择; 第二个  :Import project from external model    从外部模型导入项目,然后点击Next 4.下一步......选择你需要的jdk.然后:项目名称一定和文件名称一致,然后点击Filish就OK了 首

Java 加载动态库 dll 文件

不知道具体原理,但是,加载 dll 文件时,带路径或者更改 dll 文件的名字,都会报错.虽然库记载成功了,但是处女座认为这不可接受.于是有了这个解决方案. 在根目录为库创建软连接,然后使用 system.loadLibrary(“libname”) 来加载.事实证明,它时认软连接的. 上代码: import com.seapine.surroundscm.api.*; import java.lang.UnsupportedOperationException; import java.lan