c++ - 将一个CMakeLists文件分成多个项目

标签 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 开关中编译):
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

最佳答案

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

关于c++ - 将一个CMakeLists文件分成多个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50465020/

相关文章:

c++ - CMake : CMAKE_MAKE_PROGRAM is not set

visual-studio - 禁用 Visual Studio 项目以使用 cmake 进行构建

c++ - Qmake 创建 Visual Studio 项目 - 设置 "Working Directory"

C++ XOR 交换浮点值

c++ - 我们可以像在 C++ 中一样使用十六进制字节和字符吗?

c++11 - 命令行警告D9002 : ignoring unknown option '-std=c++11'

lua - 在cmake中找不到带有find_package的Lua头文件

cmake - 在 FindXXX.cmake 的 XXX_INCLUDE_DIRS 或 XXX_LIBRARIES 中指定多个路径

c++ - 如何用代码初始化静态成员char数组

c++ - 仅对 QTableView 中的列显示 gridLine