【问题标题】:Dividing a CMakeLists file into multiple projects将 CMakeLists 文件划分为多个项目
【发布时间】:2018-05-25 11:55:16
【问题描述】:

我目前有一个项目,它使用多个依赖项(如 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 开关中编译):
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:添加错误列表: Error Report Link

【问题讨论】:

  • 我最终为有问题的库创建了一个 /MD 文件作为热修复。现在说服高层管理人员使用我的 .lib 是一种可能的方法。

标签: c++ cmake


【解决方案1】:

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

【讨论】:

  • 我这样做了,我的项目中也添加了同样的内容。但是,当我将 protobuf 目标添加到我的 add_library 调用时,我开始遇到相同的旧 lnk2038 错误。不过感谢您的建议。非常感谢。
  • 我认为我们确实需要查看您的 CMakeLists.txt 文件和完整的错误以确定发生了什么。
  • @Sean_Burton 我已经添加了代码。这有一些我最近尝试过的更改。我没有得到的错误是 LNK2001(Unresolved external Symbol) 和 LNK2019(Unresolved External Dependecies)。
  • 除非您包含错误的全文,否则我们甚至看不到链接有问题的符号...
  • 错误报告已添加到 pastebin,因为它有点大。链接已发布。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-23
  • 1970-01-01
  • 2011-07-02
  • 2016-10-23
  • 1970-01-01
  • 2016-06-07
相关资源
最近更新 更多