1. 程式人生 > >cmake中設置ELF文件加載動態庫的位置

cmake中設置ELF文件加載動態庫的位置

table main post 位置 nbsp 可執行 可執行文件 nim .so

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路徑下查找可執行文件

cmake中設置ELF文件加載動態庫的位置