Разделение файла CMakeLists на несколько проектов

Bhoot спросил: 28 апреля 2018 в 08:28 в: c++

В настоящее время у меня есть проект, который компилируется с использованием нескольких зависимостей, таких как 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>)
  1. 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 ответ

Sean Burton ответил: 29 апреля 2018 в 10:23

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

Bhoot ответил: 29 апреля 2018 в 01:53
Я сделал это, и то же самое было добавлено в мой проект. Но, когда я добавил цель protobuf к моему вызову add_library, я начал получать те же старые ошибки lnk2038. Спасибо за совет, хотя. Очень признателен.
Sean Burton ответил: 30 апреля 2018 в 07:30
Я думаю, нам действительно нужно увидеть ваши файлы CMakeLists.txt и полные ошибки, чтобы определить, что происходит.
Bhoot ответил: 30 апреля 2018 в 08:34
@Sean_Burton Я добавил код. Это некоторые недавние изменения, которые я пробовал. Ошибка, которую я не получаю, это LNK2001 (неразрешенный внешний символ) и LNK2019 (нерешенные внешние параметры).
Sean Burton ответил: 30 апреля 2018 в 11:23
Если вы не указали полный текст ошибки, мы даже не можем видеть, какие символы у него возникают проблемы с привязкой ...
Bhoot ответил: 30 апреля 2018 в 02:15
Отчет об ошибке добавлен в пастебин, поскольку он был немного большим. Ссылка опубликована.