С++, CMake и статическая линковка runtime

Мой проект состоит из shared библиотеки которая динамически линкуется к exe. Но вот нюанс - разные компиляторы (MSVC, MinGW/GNU) тащат с собой свой рантайм. Обычно библиотеки с этим самым рантаймом есть в системе, посему обычно приложения не линкуются статически с этими библиотеками. Но что если я хочу чтобы все было сразу в одном .exe? Да он будет больше, но за то так надежнее, и выше вероятность что не потребуются какие-то доп библиотеки для работы моей программы. Для разных компиляторов эта статическая линковка runtime включается по разному:

Для MSVC достаточно сделать следующее (задается для цели сборки):

if(STATIC_RUNTIME)
    set_property(TARGET ${TARGET_NAME} PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
endif()

Для GNU/MinGW уже начинаются нюансы связанные с платформами. Например, на Windows все решается добавлением вот такого флага (MinGW):

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static")

Тогда ВСЕ цели проекта автоматически начинают статически линковаться с рантаймом и становятся больше (как .dll так и .exe).

Для Linux (GCC, G++) такая шутка не срабатывает, ибо возникает ошибка когда линкую свой екзешник со своей shared либой. Но там работает следующее:

set(CMAKE_CXX_STANDARD_LIBRARIES "-static-libgcc -static-libstdc++ ${CMAKE_CXX_STANDARD_LIBRARIES}")

Но в таком случае, по каким-то причинам, больше становится ТОЛЬКО библиотека (.so). Пусковой файл (executable) остается прежнего размера. Если же собирать только exe - тогда становится больше он. Что это, какая-то умная линковка, или тут что-то не так?

В случае с Linux можно это обойти, и сделать чтобы именно .exe линковался со статическим runtime (когда линкую свою библиотеку приписать еще рантайм):

target_link_libraries("SampleUsage" PUBLIC "Engine" -static-libgcc -static-libstdc++)

Тогда больше становится имеено exe файл.

Тоже все работает. Но вот вопрос - а как правильно то? Все ли target'ы в данном случае должны линковаться с runtime, или, если какой-то один уже в себе ее содержит - другим уже не нужно?


Ответы (0 шт):