如何解决Windows下gcc报错‘cannot find -llib/cmocka.dll’问题
cannot find -llib/cmocka.dll问题 问题描述
尝试解决GCC报错cannot find -llib/cmocka.dll,所有尝试均无效。无法理解为何GCC要查找-llib/cmocka.dll而非正确的cmocka.dll。已下载CMocka并指定路径,论坛同类问题均基于Linux环境,现使用Windows系统寻求帮助。
程序结构
程序结构示意图:根目录下包含src、test文件夹,cmake/Modules子文件夹,以及根目录的CMakeLists.txt文件。
相关CMake配置文件
根目录CMakeLists.txt
cmake_minimum_required(VERSION 3.7) project(tests LANGUAGES C ASM) set(CMAKE_C_STANDARD 99) add_subdirectory(src) list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/Modules") # cmocka find_package(CMocka CONFIG) if (CMocka_FOUND) message("cmocka found") include(AddCMockaTest) include(AddMockedTest) add_subdirectory(test) enable_testing() endif(CMocka_FOUND)
cmake/Modules/AddCMockaTest.cmake
enable_testing() include(CTest) if (CMAKE_CROSSCOMPILING) if (WIN32) find_program(WINE_EXECUTABLE NAMES wine) set(TARGET_SYSTEM_EMULATOR ${WINE_EXECUTABLE} CACHE INTERNAL "") endif() endif() function(ADD_CMOCKA_TEST _TARGET_NAME) set(one_value_arguments ) set(multi_value_arguments SOURCES COMPILE_OPTIONS COMPILE_DEFINITION LINK_LIBRARIES LINK_OPTIONS ) cmake_parse_arguments(_add_cmocka_test "" "${one_value_arguments}" "${multi_value_arguments}" ${ARGN} ) if (NOT DEFINED _add_cmocka_test_SOURCES) message(FATAL_ERROR "No sources provided for target ${_TARGET_NAME}") endif() add_executable(${_TARGET_NAME} ${_add_cmocka_test_SOURCES}) if (DEFINED _add_cmocka_test_COMPILE_OPTIONS) target_compile_options(${_TARGET_NAME} PRIVATE ${_add_cmocka_test_COMPILE_OPTIONS} ) endif() if (DEFINED _add_cmocka_test_LINK_LIBRARIES) target_link_libraries(${_TARGET_NAME} PRIVATE ${_add_cmocka_test_LINK_LIBRARIES} ) endif() if (DEFINED _add_cmocka_test_LINK_OPTIONS) set_target_properties(${_TARGET_NAME} PROPERTIES LINK_FLAGS ${_add_cmocka_test_LINK_OPTIONS} ) endif() add_test(${_TARGET_NAME} ${TARGET_SYSTEM_EMULATOR} ${_TARGET_NAME} ) endfunction (ADD_CMOCKA_TEST)
cmake/Modules/AddMockedTest.cmake
function(add_mocked_test name) # parse arguments passed to the function set(options ) set(oneValueArgs ) set(multiValueArgs SOURCES MOCKS COMPILE_OPTIONS LINK_LIBRARIES LINK_OPTIONS) cmake_parse_arguments(ADD_MOCKED_TEST "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} ) # create link flags for mocks set(link_flags "") foreach (mock ${ADD_MOCKED_TEST_MOCKS}) set(link_flags "${link_flags} -Wl,--wrap=${mock}") endforeach(mock) # define test add_cmocka_test(test_${name} SOURCES test_${name}.c ${ADD_MOCKED_TEST_SOURCES} COMPILE_OPTIONS ${DEFAULT_C_COMPILE_FLAGS} ${ADD_MOCKED_TEST_COMPILE_OPTIONS} LINK_LIBRARIES ${CMOCKA_LIBRARIES} ${ADD_MOCKED_TEST_LINK_LIBRARIES} LINK_OPTIONS ${link_flags} ${ADD_MOCKED_TEST_LINK_OPTIONS}) # allow using includes from src/ directory target_include_directories(test_${name} PRIVATE ${CMAKE_SOURCE_DIR}/src) endfunction(add_mocked_test)
解决方案
问题根源
在Windows环境下,CMake的find_package(CMocka CONFIG)可能错误地将库的路径信息包含到了CMOCKA_LIBRARIES变量中,导致GCC在链接时使用-llib/cmocka.dll这种非法参数——GCC的-l参数仅接受库名称(不带.dll后缀,也不带路径),正确的参数应该是-lcmocka。
具体修复步骤
检查
CMOCKA_LIBRARIES变量内容
在根目录CMakeLists.txt中添加调试输出,确认变量是否包含路径:find_package(CMocka CONFIG) if (CMocka_FOUND) message(STATUS "CMOCKA_LIBRARIES: ${CMOCKA_LIBRARIES}") # ... 原有代码 endif()如果输出包含类似
lib/cmocka.dll的路径,说明变量配置错误。手动修正库变量
如果CMOCKA_LIBRARIES包含路径,重新查找库并提取纯库名:# 替换原有的find_package部分 set(CMOCKA_ROOT "path/to/your/cmocka" CACHE PATH "CMocka安装根目录") find_library(CMOCKA_LIB NAMES cmocka PATHS "${CMOCKA_ROOT}/lib" NO_DEFAULT_PATH ) if (CMOCKA_LIB) get_filename_component(CMOCKA_LIB_NAME ${CMOCKA_LIB} NAME_WE) set(CMOCKA_LIBRARIES ${CMOCKA_LIB_NAME}) set(CMOCKA_INCLUDE_DIRS "${CMOCKA_ROOT}/include") message("cmocka found") include(AddCMockaTest) include(AddMockedTest) add_subdirectory(test) enable_testing() else() message(FATAL_ERROR "CMocka library not found") endif()同时在
AddMockedTest.cmake中添加库搜索路径:# 在add_cmocka_test调用后添加 target_link_directories(test_${name} PRIVATE "${CMOCKA_ROOT}/lib")修正链接参数格式
Windows下GCC链接动态库时,不需要直接指定.dll文件,只需用-lcmocka即可。确保LINK_LIBRARIES中只传递cmocka而非带路径的文件名。检查CMake模块路径
确认CMAKE_MODULE_PATH正确指向包含CMocka配置文件的目录,或者直接指定CMOCKA_DIR:set(CMOCKA_DIR "${CMOCKA_ROOT}/lib/cmake/CMocka" CACHE PATH "CMocka配置文件目录") find_package(CMocka REQUIRED CONFIG)
内容的提问来源于stack exchange,提问作者just_name

