【发布时间】: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 文件:
- 插件 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
【问题讨论】:
-
我最终为有问题的库创建了一个 /MD 文件作为热修复。现在说服高层管理人员使用我的 .lib 是一种可能的方法。