簡單工程示例
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路徑下查找可執行文件