如何通过VCPKG/CMake让activemq-cpp用C++14编译,项目用C++20?
解决方案:混合C++标准构建项目
完全可以实现让activemq-cpp以C14编译,同时项目主体使用C20。核心是避免全局设置C++标准,改为给单个目标指定对应标准,具体修改如下:
1. 修改CMakeLists.txt
移除全局的set(CMAKE_CXX_STANDARD 14),替换为目标级别的标准配置:
# --- General CMake settings ------------------------------------------- cmake_minimum_required(VERSION 3.21 FATAL_ERROR) set(PROJECT_NAME "OpenCASCADE_Rendering_Server") set(PROJECT_VERSION "0.13.1") message(STATUS "Project Name: ${PROJECT_NAME} | Version: ${PROJECT_VERSION}") project(${PROJECT_NAME} LANGUAGES CXX VERSION ${PROJECT_VERSION}) # --- C++ Preprocessor Definitions -------------------------------------- add_compile_definitions($<$<CONFIG:DEBUG>:_DEBUG> $<$<NOT:$<CONFIG:DEBUG>>:NDEBUG>) if (CMAKE_HOST_WIN32) add_compile_definitions(WIN32) elseif (CMAKE_HOST_UNIX) add_compile_definitions(UNIX) endif (CMAKE_HOST_WIN32) # --- Packages ---------------------------------------------------------- find_package(OpenCASCADE CONFIG REQUIRED) find_package(Protobuf CONFIG REQUIRED) find_package(activemq-cpp CONFIG REQUIRED) # 为activemq-cpp及其依赖的apr强制设置C++14标准 set_target_properties(unofficial::activemq-cpp::activemq-cpp unofficial::activemq-cpp::apr PROPERTIES CXX_STANDARD 14 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF ) # --- Add custom CMake modules ------------------------------------------ include(cmake/protobufcompile.cmake) # --- Add source files & Executable ------------------------------------- list(APPEND SRC /* Application .cpp files */) list(APPEND HDR /* Application .h files */) configure_file(config.h.in ${CMAKE_CURRENT_SOURCE_DIR}/src/config.h @ONLY) add_executable(${PROJECT_NAME} ${SRC} ${HDR} ${PROTOBUF_GENERATED_FILES}) # 为项目自身设置C++20标准 set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 20 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF ) # --- Add include directories ------------------------------------------- target_include_directories(${PROJECT_NAME} PRIVATE src) # --- Add external libraries main executable ---------------------------- target_link_libraries(${PROJECT_NAME} PRIVATE ${OpenCASCADE_LIBRARIES}) target_include_directories(${PROJECT_NAME} SYSTEM PRIVATE ${OpenCASCADE_INCLUDE_DIR}) target_link_libraries(${PROJECT_NAME} PRIVATE protobuf::libprotoc protobuf::libprotobuf protobuf::libprotobuf-lite) target_include_directories(${PROJECT_NAME} SYSTEM PRIVATE ${PROTOBUF_COMPILER_CPP_OUT}) target_link_libraries(${PROJECT_NAME} PRIVATE unofficial::activemq-cpp::apr unofficial::activemq-cpp::activemq-cpp) if (CMAKE_HOST_WIN32) target_link_libraries(${PROJECT_NAME} PRIVATE unofficial::activemq-cpp::ws2 unofficial::activemq-cpp::rpcrt4 unofficial::activemq-cpp::mswsock) endif (CMAKE_HOST_WIN32)
2. 配置vcpkg确保activemq-cpp用C++14编译
修改vcpkg.json,为activemq-cpp添加编译标准配置,确保vcpkg在构建该库时使用C++14:
{ "dependencies": [ { "name": "opencascade", "version>=": "7.8.1" }, { "name": "protobuf", "version>=": "3.21.8" }, { "name": "activemq-cpp", "version>=": "3.9.5#15", "configurations": { "cmake": { "CMAKE_CXX_STANDARD": "14" } } } ], "version-string": "0.13.1", "name": "opencascade-rendering-viewer" }
原理说明
CMake支持为不同目标设置独立的C标准,只要链接的库与项目主体保持二进制兼容性即可。C14与C20在主流编译器(GCC、Clang、MSVC)下的ABI是兼容的,因此activemq-cpp(C14编译)可以和项目主体(C++20编译)正常链接运行。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

