我目前有一个使用多个依赖项(如 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 文件:
- 插件 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:添加错误列表: Error Report Link
最佳答案
您应该能够在根文件夹中创建一个主 CMakeLists.txt,然后使用“add_subdirectory”命令添加包含其他 CMakeLists.txt 文件的任何子目录。然后您可以在任何其他文件中使用一个文件中的目标名称。
关于c++ - 将一个CMakeLists文件分成多个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50465020/