Статическое связывание .lib файлов в cmake - PullRequest
1 голос
/ 06 марта 2019

Я пытаюсь использовать IUP для создания программы с графическим интерфейсом в Windows 10. Я также использую Clion + MSVC в качестве IDE. IUP имеет файлы .lib и .dll для загрузки, и все идет хорошо, когда я не указываю, как создать ссылку в cmake; cmake автоматически пытается динамически связываться с iup.dll, когда нет никаких пользовательских флагов для связывания.

Однако, когда я пытаюсь статически связать iup.dll с флагом компилятора /MT, компилятор автоматически меняет /MT на /MD и просто динамически связывает.

Вот код cmake, который я использовал для принудительного статического связывания компилятора:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /MT")

и тогда я получаю это предупреждение:

cl : Command line warning D9025 : overriding '/MT' with '/MD'

Есть ли способ "заставить" cmake и компилятор статически связать библиотеку с моей программой?

Ответы [ 3 ]

0 голосов
/ 06 марта 2019

По умолчанию CMake использует динамическую библиотеку MSVC (/MD) при создании статических или общих библиотек.

Вам необходимо заменить настройку /MD в переменных CMAKE_C_FLAGS / CMAKE_CXX_FLAGS на /MT. Это можно сделать с помощью следующих команд:

string(REGEX REPLACE "/MD" "/MT" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
string(REGEX REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")

Полное решение см. В следующей записи

0 голосов
/ 09 марта 2019

Другие варианты:

set_target_properties(TARGET_LIB PROPERTIES
    COMPILE_OPTIONS "$<$<CONFIG:Debug>:/MTd>$<$<CONFIG:Release>:/MT>"
    )
0 голосов
/ 06 марта 2019

Cmake имел команды для автоматической установки почти всех этих флагов.

Попробуйте добавить add_library(iup.dll STATIC IMPORTED) перед target_link_libraries

Cmake doc

...