Cmake:静态链接在运行时需要库(appcrash 0xC0000135)

Cmake: static linking requires libraries at the runtime (appcrash 0xC0000135)

本文关键字:appcrash 0xC0000135 静态 链接 运行时 Cmake      更新时间:2023-10-16

我正在尝试将一系列外部库(使用libjpeg的liblept)链接到一个项目。多次尝试和搜索互联网只是导致了不同的cmake错误,这让非常困惑

项目文件夹的结构:

/Project
  |leptonica
  |--|include
  |  |--|leptonica
  |  |  |--|<allheaders.h used by main.cpp is here>
  |  |  |<jpeglib.h used by Leptonica is here>
  |  |lib
  |  |--|<.lib files here>
  |CMakeLists.txt
  |main.cpp

现在,CMakeLists。关于链接这些库,我唯一知道的是,围绕Stack Overflow找到的基本提示会产生不同的错误。除以下情况外:

这将链接项目,但应用程序因0xC0000135而崩溃(找不到dll)。

cmake_minimum_required(VERSION 3.5)
project(Project)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(SOURCE_FILES main.cpp)
add_library(liblept168 STATIC IMPORTED)
set_target_properties(
    liblept168
    PROPERTIES LINKER_LANGUAGE CXX
    IMPORTED_LOCATION %Project%/leptonica/lib/liblept168.lib)
add_library(libjpeg8c-static-mtdll STATIC IMPORTED)
set_target_properties(
    libjpeg8c-static-mtdll
    PROPERTIES LINKER_LANGUAGE CXX
    IMPORTED_LOCATION %Project%/leptonica/lib/libjpeg8c-static-mtdll.lib)
link_directories(leptonica/lib)
include_directories(leptonica/include)
include_directories(leptonica/include/leptonica)
add_executable(Project "${SOURCE_FILES}")
target_link_libraries(Project liblept168 libjpeg8c-static-mtdll)

怎么了?

感谢Jack关于.libs的说明,我发现了问题。问题是liblept168.libliblept168.dll的链接文件,而不是静态库。因此,dll应该复制到可执行文件夹中。生成的CMakeLists如下所示:

cmake_minimum_required(VERSION 3.5)
project(Jpeg_to_values)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(SOURCE_FILES main.cpp)
add_library(liblept168 SHARED IMPORTED)
set_target_properties(
    liblept168
    PROPERTIES LINKER_LANGUAGE CXX
    IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/leptonica/lib/liblept168.dll
    IMPORTED_IMPLIB ${PROJECT_SOURCE_DIR}/leptonica/lib/liblept168.lib)
add_library(libjpeg8c-static-mtdll STATIC IMPORTED)
set_target_properties(
        libjpeg8c-static-mtdll
        PROPERTIES LINKER_LANGUAGE CXX
        IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/leptonica/lib/libjpeg8c-static-mtdll.lib)
link_directories(leptonica/lib)
include_directories(leptonica/include)
include_directories(leptonica/include/leptonica)
add_executable(Jpeg_to_values "${SOURCE_FILES}")
target_link_libraries(Jpeg_to_values liblept168 libjpeg8c-static-mtdll)
add_custom_command(
        TARGET Jpeg_to_values POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_if_different
        "${PROJECT_SOURCE_DIR}/leptonica/lib/liblept168.dll"
        "$<TARGET_FILE_DIR:Jpeg_to_values>")