Понимание общих библиотек - PullRequest
0 голосов
/ 18 декабря 2018

Я изучаю язык программирования 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)

, и он начал работать, но я не совсем понял, почему.Что не так с созданием разделяемой библиотеки из статической?

...