我正在学习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)
它开始起作用,但是我真的不明白为什么。用静态库创建共享库有什么问题?