You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 20:26:20