了解共享库

时间:2018-12-18 07:56:20

标签: c shared-libraries

我正在学习C编程语言,现在我正尝试使用CMake编译共享库。我有以下项目树

prj
|
|___ filesys
|       |
|       |_____include
|       |        |
|       |        |___filesys.h
|       |
|       |_______src
|       |        |
|       |        |___filesys.c
|       |
|       |____CMakeLists.txt
|
|_____lib-interface.h
|
|_____lib-interface.c
|
|_____CMakeLists.txt

因此,我具有库根目录和一个用于处理文件系统的filesys子模块。这是

prj/CMakeLists.txt

cmake_minimum_required(VERSION 3.0.0)
set(CMAKE_C_FLAGS "-Wall -Wshadow -Wextra -pedantic")
set(CMAKE_BUILD_TYPE Debug)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

project(test-statx)
include_directories("${PROJECT_SOURCE_DIR}/filesys/include")
add_subdirectory(filesys)

add_library(timer SHARED lib-interface.c)
target_link_libraries(timer filesys)

prj/filesys/CMakeLists.txt

add_library(filesys src/filesys.c)

问题是链接时出现错误:

/usr/bin/x86_64-linux-gnu-ld: filesys/libfilesys.a(filesys.c.o): 
relocation R_X86_64_PC32 against symbol `stderr@@GLIBC_2.2.5' can not be
used when making a shared object; recompile with -fPIC

我不太了解它的工作原理。

我认为静态库是一种在链接时仅内联的已编译代码,但是共享库是关于引用和在运行时加载的。

我将prj/filesys/CMakeLists.txt修改为

add_library(filesys SHARED src/filesys.c)

它开始起作用,但是我真的不明白为什么。用静态库创建共享库有什么问题?

0 个答案:

没有答案