如何为CMake中FetchContent拉取的依赖添加预处理器定义?
为FetchContent拉取的sioclient设置预处理器定义
要给FetchContent引入的sioclient依赖单独设置预处理器定义,有两种可靠的实现方式:
方式一:在依赖配置阶段注入设置
在调用FetchContent_MakeAvailable之前,通过CMAKE_PROJECT_<PROJECT-NAME>_INCLUDE变量注入自定义CMake脚本,在脚本中为sioclient及其依赖的websocketpp添加编译定义:
- 创建名为
sioclient-overrides.cmake的文件,内容如下:
# 为sioclient目标添加禁用异常的预处理器定义 target_compile_definitions(sioclient PUBLIC _WEBSOCKETPP_NO_EXCEPTIONS_) # 同时为依赖的websocketpp目标设置定义 if(TARGET websocketpp) target_compile_definitions(websocketpp PUBLIC _WEBSOCKETPP_NO_EXCEPTIONS_) endif()
- 修改主CMakeLists.txt中的FetchContent代码:
FetchContent_Declare( sioclient GIT_REPOSITORY https://github.com/socketio/socket.io-client-cpp.git GIT_TAG 3.1.0 ) # 指定注入的配置脚本,在sioclient项目配置前执行 set(CMAKE_PROJECT_sioclient_INCLUDE "${CMAKE_CURRENT_LIST_DIR}/sioclient-overrides.cmake") FetchContent_MakeAvailable(sioclient)
方式二:在依赖构建完成后修改目标属性
如果已经调用了FetchContent_MakeAvailable,可以直接定位sioclient的目标,通过target_compile_definitions添加预处理器定义:
FetchContent_Declare( sioclient GIT_REPOSITORY https://github.com/socketio/socket.io-client-cpp.git GIT_TAG 3.1.0 ) FetchContent_MakeAvailable(sioclient) # 为sioclient目标添加禁用异常的预处理器定义 target_compile_definitions(sioclient PUBLIC _WEBSOCKETPP_NO_EXCEPTIONS_) # 同步处理依赖的websocketpp目标 if(TARGET websocketpp) target_compile_definitions(websocketpp PUBLIC _WEBSOCKETPP_NO_EXCEPTIONS_) endif()
补充说明
target_compile_definitions的PUBLIC关键字会确保该定义传递给所有链接sioclient的目标(包括你的项目),若仅需给sioclient自身设置,可改用PRIVATE。- 由于sioclient底层依赖websocketpp,
_WEBSOCKETPP_NO_EXCEPTIONS_是websocketpp的预处理器定义,同时给websocketpp目标设置该定义可避免编译冲突。
内容的提问来源于stack exchange,提问作者Bolderaysky
相关产品推荐
相关产品推荐

