将CMakeLists文件划分为多个项目

时间:2018-05-22 10:08:03

标签: c++ cmake

我目前有一个项目,它使用boost和protobuf等多个依赖项进行编译。现在,为静态链接(/ MT)创建了protobuf .lib。另一方面,boost .lib用于动态链接(/ MD)。我希望最终输出存在以进行动态链接。

当我尝试使用/ MD构建protobuf时,同样会导致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开关中):
  2. 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开关编译的。
    2. 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:添加错误列表: Error Report Link

1 个答案:

答案 0 :(得分:1)

您应该能够在根文件夹中创建一个主CMakeLists.txt,然后使用&#39; add_subdirectory&#39;用于添加包含其他CMakeLists.txt文件的子目录的命令。然后,您可以使用其他任何文件中的目标名称。