Объединение библиотек объектов CMake с общими библиотеками - PullRequest
0 голосов
/ 30 мая 2018

У меня есть следующий 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).

Библиотеки объектов на каталог, которые затем используются для сборки разделяемой библиотеки, кажутся хорошим решением дляэта проблема.

1 Ответ

0 голосов
/ 30 мая 2018

Это правильный способ решить эту проблему?

Да, это так.

Поскольку bar (общий доступ) связандля foo (статический) оба из bar и foo должны быть скомпилированы с независимым от позиции кодом.

CMake знает, что bar является общей библиотекой, а позволяет позиционно-независимому коду:по умолчанию .Но поскольку foo является статическим объектом, даже если он может предположить, что он должен быть PIC 1 , он не включает PIC по умолчанию для foo.

В соответствии с вопросом SO Какой идиоматический способ в CMAKE добавить опцию компилятора -fPIC?

Вы можете установить независимое от позиции свойство кода для всех целей:

set(CMAKE_POSITION_INDEPENDENT_CODE ON)

или в определенной библиотеке:

add_library(lib1 SHARED lib1.cpp)
set_property(TARGET lib1 PROPERTY POSITION_INDEPENDENT_CODE ON)

Ссылка: CMAKE_POSITION_INDEPENDENT_CODE cmake build build


1) Это может быть предложенная функция, возможно, она уже есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...