CMake: Как я могу создать общую и статическую библиотеку без повторной компиляции источников дважды?

Я хочу создать статическую и общую версию той же библиотеки, как описано Можно ли заставить CMake создавать статическую и общую версию той же библиотеки?

Однако источники скомпилированы дважды, по одному для каждой версии, что необязательно. Есть ли способ избежать этого?

В настоящее время у меня есть:

add_library(${LIB} SHARED ${${LIB}_srcs})

add_library(${LIB}_static STATIC ${${LIB}_srcs})

Что мне нужно изменить, чтобы компилировать только один раз? FYI. У меня есть те же флаги компилятора и определяет.

Ответ 1

It невозможно и не рекомендуется для создания общей/статической версии библиотеки из того же набора объектных файлов - по крайней мере на многих платформах.

Объектные файлы, связанные с общей библиотекой, должны быть скомпилированы как независимый по позиции код (-fpic/-fpic в Linux/Solaris и т.д..), тогда как ваши исполняемые и статические библиотеки (обычно) не содержат независимого от позиции кода. С другой стороны, разделяемые библиотеки торгуют с использованием кодовых страниц с накладными расходами во время выполнения из-за отсутствия ссылок. Поскольку эти косвенные функции не нужны для статических библиотек и двоичных файлов, независимый от позиции код обеспечивает только недостатки с помощью thoses. Таким образом, если вы хотите создать как общую, так и статическую библиотечную версию, вам нужно создать два разных набора объектных файлов (один из которых не зависит от позиции, а другой - наоборот).