У меня есть следующий CMakeLists.txt, определяющий библиотеку объектов и разделяемую библиотеку в зависимости от библиотеки объектов, следующим образом:
add_library(foo OBJECT
foo.cpp
)
add_library(bar SHARED
bar.cpp
$<TARGET_OBJECTS:foo>
)
add_executable(baz baz.cpp)
target_link_libraries(baz
PUBLIC bar
)
Я получаю следующую ошибку компоновщика при компоновке baz
:
/usr/bin/ld: CMakeFiles/foo.dir/foo.cpp.o: relocation R_X86_64_PC32 against symbol `_ZSt4cout@@GLIBCXX_3.4' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Bad value
Это потому, что foo.cpp
не построен с -fPIC
(bar.cpp
is).Это можно решить, добавив:
set_property(TARGET foo PROPERTY POSITION_INDEPENDENT_CODE ON)
Это правильный способ исправить эту проблему?Мне кажется, для этого должно быть более чистое решение.Я чувствую, что здесь CMake может быть умнее и вижу, что объекты из foo
используются только в контексте, где требуется -fPIC
.Я использую CMake 3.11.
Некоторый контекст;В нашем проекте нам нужно создать единую общую библиотеку из множества источников, разбросанных по разным каталогам.Прямо сейчас мы создаем отдельные общие библиотеки для каждого каталога.Большинство этих библиотек зависят от исходных текстов Bison, которые за кулисами зависят от add_custom_command
, подлежащего сборке.Это вводит зависимости времени компиляции между библиотеками, серьезно ограничивая степень параллелизации сборки (см .: https://gitlab.kitware.com/cmake/cmake/issues/15555).
Библиотеки объектов на каталог, которые затем используются для сборки разделяемой библиотеки, кажутся хорошим решением дляэта проблема.