Я изучаю язык программирования 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)
, и он начал работать, но я не совсем понял, почему.Что не так с созданием разделяемой библиотеки из статической?