CMAKE_step5:增加系统检查条件编译

这篇博客介绍了如何在CMake项目中检查系统是否提供log和exp函数。如果存在,代码将利用这些函数优化平方根的计算,通过exp(log(x) * 0.5)来替代原始实现。CMakeLists.txt文件配置了检查过程,并根据结果决定是否链接数学库。在源代码中,根据宏定义选择不同的计算方式。

在实现平方根函数时候,可以检查系统是否带有某个函数,比如log,exp。用CheckSymbolExists模块里的函数在math.h中检查,如果有就用exp(1/2)来替换原来的函数实现。具体如下:

  • MathFunctions/CMakeLists.txt中内容如下,

add_library(MathFunctions mysqrt.cxx)

target_include_directories(MathFunctions
          INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}
          )

# does this system provide the log and exp functions?
include(CheckSymbolExists)
check_symbol_exists(log "math.h" HAVE_LOG)
check_symbol_exists(exp "math.h" HAVE_EXP)
if(NOT (HAVE_LOG AND HAVE_EXP))
  unset(HAVE_LOG CACHE)
  unset(HAVE_EXP CACHE)
  set(CMAKE_REQUIRED_LIBRARIES "m")
  check_symbol_exists(log "math.h" HAVE_LOG)
  check_symbol_exists(exp "math.h" HAVE_EXP)
  if(HAVE_LOG AND HAVE_EXP)
    target_link_libraries(MathFunctions PRIVATE m)
  endif()
endif()

if(HAVE_LOG AND HAVE_EXP)
  target_compile_definitions(MathFunctions
                             PRIVATE "HAVE_LOG" "HAVE_EXP")
endif()

install(TARGETS MathFunctions DESTINATION lib)
install(FILES MathFunctions.h DESTINATION include)

  • MathFunctions/mysqrt.cxx内容如下,

#include <math.h>
#include "MathFunctions.h"
#include <cmath>
#include <iostream>

double mysqrt(double x)
{
#if defined(HAVE_LOG) && defined(HAVE_EXP)
  double result = exp(log(x) * 0.5);
  std::cout << "Computing sqrt of " << x << " to be " << result
            << " using log and exp" << std::endl;
#else
  double result = x;
#endif
   return result;
}

编译与执行,

 

cmake_minimum_required(VERSION 3.5) set(BUILD_SHARED_LIBS OFF) project(mach_misc) if ($ENV{BUILD_DEBUG}) add_definitions("-g -O0") endif () # Default to C++14 if(NOT CMAKE_CXX_STANDARD) set(CMAKE_CXX_STANDARD 17) endif() if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64") message(WARNING "x86_64 is not supported") return() endif() SET(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin) SET(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib) find_package(ament_cmake_auto REQUIRED) ament_auto_find_build_dependencies() find_package(interfaces_mos_generated REQUIRED) find_package(constants REQUIRED) find_package(mach_log) find_package(mos REQUIRED) # find_package(tf2 REQUIRED) find_package(Eigen3 REQUIRED) find_package(toml11 REQUIRED) message(STATUS "MACH_AP_THOR_CMAKE_PREFIX_PATH is ${MACH_AP_THOR_CMAKE_PREFIX_PATH}") find_package(Threads) SET(CMAKE_PREFIX_PATH ${MACH_AP_THOR_CMAKE_PREFIX_PATH}) set(AMSR_STATIC_LIBRARIES TRUE) find_package(AMSR COMPONENTS amsr::applicationbase amsr::com_r18_03 amsr::em_application_client amsr::ipcbinding amsr::log_ara_logging amsr::osa_common amsr::socal amsr::someipbinding amsr::vac amsr::phm_common amsr::phm_external amsr::phm amsr::phm_base_services amsr::phm_state_management_client amsr::phm_watchdog_client amsr::phm_daemon_impl amsr::tsync_common amsr::tsync_ara ) include_directories(${CMAKE_SOURCE_DIR}/src ${CONAN_INCLUDE_DIRS} ${Eigen3_INCLUDE_DIRS}) add_executable(mach_miscExe main.cpp data_compressed/src/config/cfg_mgr.cpp data_compressed/src/publish/pub_base.cpp data_compressed/src/publish/pub_mgr.cpp data_compressed/src/publish/pub_custom.cpp data_compressed/src/subscribe/sub_base.cpp data_compressed/src/data_compressed_node.cpp src/mach_misc_sr_node.cpp trigger_node/src/trigger_node.cpp trigger_node/src/config/config_manager.cpp trigger_node/src/rule/rule_base.cpp trigger_node/src/rule/rule_manager.cpp trigger_node/src/action/action_manager.cpp trigger_node/src/variable/variable_manager.cpp ) target_compile_definitions(mach_miscExe PRIVATE ENABLE_AP_CODE) target_include_directories(mach_miscExe PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/data_compressed/src ${CMAKE_CURRENT_SOURCE_DIR}/trigger_node/src ) ament_target_dependencies(mach_miscExe constants) target_link_libraries(mach_miscExe # ${tf2_LIBRARIES} # Eigen3::Eigen mach_log::mach_log interfaces_mos_generated::interfaces_mos_generated amsr::applicationbase amsr::com_r18_03 amsr::em_application_client amsr::ipcbinding amsr::log_ara_logging amsr::osa_common amsr::socal amsr::someipbinding amsr::vac amsr::phm_common amsr::phm_external amsr::phm amsr::phm_base_services amsr::phm_state_management_client amsr::phm_watchdog_client amsr::phm_daemon_impl amsr::tsync_common amsr::tsync_ara Threads::Threads mos::mos_common mos::msg_interface mos::ap_misc # mos_e2e_idls calibration_interfaces::mos_msg toml11::toml11 # algo_interface::algo_interface ) message("==============MACH_AP_RELEASE_BASE_DIR" ${MACH_AP_RELEASE_BASE_DIR}) # file(COPY ${MACH_AP_RELEASE_BASE_DIR}/res/${PROCESS_NAME}Exe/etc DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) # install(TARGETS ${PROJECT_NAME}Exe # DESTINATION bin # ) install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/trigger_node/src/config/remote_config.toml DESTINATION config) install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/data_compressed/src/config/module_config.toml DESTINATION config) # install(DIRECTORY ${MACH_AP_RELEASE_BASE_DIR}/res/${PROJECT_NAME}Exe/etc/ DESTINATION etc) install(TARGETS mach_miscExe DESTINATION bin ) WARNING:colcon.colcon_cmake.task.cmake.build:Could not run installation step for package 'mach_misc' because it has no 'install' target
07-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值