Разделение файла CMakeLists на несколько проектов - PullRequest
0 голосов
/ 22 мая 2018

В настоящее время у меня есть проект, который компилируется с использованием нескольких зависимостей, таких как boost и protobuf.Теперь protobuf .lib создан для статической связи (/ MT).Boost .lib, с другой стороны, предназначен для динамического связывания (/ MD).Я хочу, чтобы конечный вывод существовал для динамического связывания.

Когда я пытаюсь собрать protobuf с / MD, то же самое вызывает ошибки LNK2038.Поэтому я решил перенести protobuf в отдельный проект для сборки в виде / MT, но вывести файл / MD.

Теперь проблема возникает из-за моей неспособности выполнить вышеизложенное, так как мне еще предстоит пройти путь CMake.Я попытался создать несколько проектов в одном файле CMakeLists, но это привело к сбою конфигурации моего cmake-gui.Поэтому я попытался разделить его на несколько файлов.Я переместил свой файл .proto в другую папку и создал для него файл CMakeLists.То же самое начинается с:

set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd") 

Теперь я не знаю, как связать выходные файлы, сгенерированные с предыдущим проектом CMakeLists.

Я надеялся получить несколько советов о том, как действовать.

Спасибо

Редактировать 01: Добавление файлов CMakeLists.txt:

  1. ПлагинCMakeList (скомпилированный в / MD переключатель):
cmake_policy(SET CMP0043 OLD)  
include_directories(
    ~~~~~~~~Some paths~~~~~~~~~
    )  
add_subdirectory(protobuf_model)  
include_directories(${Protobuf_INCLUDE_DIR})  
set(<SRC_NAME>  
   ~~~~Some file names~~~~~~
)

find_package(Qt5Widgets)  
add_library(<plugin_name> MODULE ${SRC_NAME} $<TARGET_OBJECTS:protobuf_model>)  

set_target_properties(<plugin_name> PROPERTIES LINKER_LANGUAGE CXX)

target_link_libraries(<plugin_name>  
    ${MAIN_TARGET}  
    ${QT_QTCORE_LIBRARY}  
    ${QT_QTGUI_LIBRARY}  
    ${OGRE_LIBRARIES}  
    ${MyGUI_LIBRARY}  
    ${QT_LIBRARIES}  
    ${Boost_LIBRARIES})

install_plugin(<plugin_name>)
Protobuf CMakeLists (я пытался скомпилировать это в / MT и / MD).Обратите внимание, что protobuf.lib скомпилирован с ключом / MT.
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd") 

find_package(Protobuf REQUIRED)
set(PROTO_FILES
    file.proto)

protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS ${PROTO_FILES})
set_source_files_properties(${PROTO_SRCS} ${PROTO_HDRS} PROPERTIES GENERATED TRUE)
include_directories(${Protobuf_INCLUDE_DIR})

add_library(protobuf_model OBJECT ${PROTO_SRCS} ${PROTO_HDRS})
set_target_properties(protobuf_model PROPERTIES LINKER_LANGUAGE CXX)
#I tried adding this too: target_sources(protobuf_model INTERFACE ${PROTOBUF_LIBRARIES})

if (MSVC AND USE_FLEXNET)
  target_compile_definitions(protobuf_model PRIVATE _HAS_ITERATOR_DEBUGGING=0)
endif ()

Редактировать 02: Добавление списка ошибок: Ссылка на отчет об ошибке

1 Ответ

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

Вы должны иметь возможность создать основной файл CMakeLists.txt в корневой папке, а затем использовать команды «add_subdirectory» для добавления любых подкаталогов, содержащих другие файлы CMakeLists.txt.Тогда вы можете просто использовать целевые имена из одного файла в любом другом.

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