Windows下Cygwin环境中CMake查找CUnit库失败的解决咨询
问题解决:Cygwin下CMake交叉编译时无法找到CUnit库
核心问题原因
交叉编译模式下,CMake默认会限制在ARM-GCC工具链的sysroot路径内查找依赖,而你通过Cygwin安装的CUnit位于主机(Cygwin)的/usr/include和/usr/lib路径下,不在交叉编译目标的sysroot中,因此find_package(CUnit)会失败。
是否无需自定义FindCUnit.cmake即可解决?
可以,无需自定义查找脚本,通过调整CMake的查找模式即可让它找到主机上的CUnit:
方法1:临时调整全局查找模式(推荐)
在调用find_package(CUnit REQUIRED)前后,临时修改查找规则,避免影响后续交叉编译依赖的查找:
# 保存原有的交叉编译查找模式 set(_ORIG_INC_MODE ${CMAKE_FIND_ROOT_PATH_MODE_INCLUDE}) set(_ORIG_LIB_MODE ${CMAKE_FIND_ROOT_PATH_MODE_LIBRARY}) # 允许CMake同时在主机路径和交叉编译sysroot中查找 set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH) # 查找CUnit find_package(CUnit REQUIRED) # 恢复原有的交叉编译查找模式 set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ${_ORIG_INC_MODE}) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ${_ORIG_LIB_MODE})
方法2:直接指定路径(简单粗暴)
如果不想用find_package,可以直接硬编码CUnit的头文件和库路径:
# 添加CUnit头文件路径 include_directories(/usr/include) # 添加CUnit库路径 link_directories(/usr/lib) # 编译测试用例时链接CUnit add_executable(your_test_case test_source.c) target_link_libraries(your_test_case PRIVATE CUnit)
若必须使用自定义FindCUnit.cmake的解决方法
如果一定要用自定义查找脚本,需要在脚本中明确跳过交叉编译的路径限制,添加NO_CMAKE_FIND_ROOT_PATH参数:
# FindCUnit.cmake 内容 find_path(CUNIT_INCLUDE_DIR NAMES CUnit/CUnit.h PATHS /usr/include NO_CMAKE_FIND_ROOT_PATH) find_library(CUNIT_LIBRARY NAMES cunit PATHS /usr/lib /lib NO_CMAKE_FIND_ROOT_PATH) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(CUnit DEFAULT_MSG CUNIT_INCLUDE_DIR CUNIT_LIBRARY) if(CUNIT_FOUND) set(CUNIT_INCLUDE_DIRS ${CUNIT_INCLUDE_DIR}) set(CUNIT_LIBRARIES ${CUNIT_LIBRARY}) mark_as_advanced(CUNIT_INCLUDE_DIR CUNIT_LIBRARY) endif()
将这个脚本放在CMake的模块路径中(比如项目根目录的cmake/modules下,然后在主CMakeLists.txt中添加set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/modules")),再调用find_package(CUnit REQUIRED)即可。
内容的提问来源于stack exchange,提问作者Guillaume Martin
相关产品推荐
相关产品推荐

