首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >生成的GDCM无法使用VTK,该怎么解决?

生成的GDCM无法使用VTK,该怎么解决?

提问于 2025-09-26 23:51:04
回答 0关注 1查看 17

我正在做一个DICOMViewer小项目,由于VTK本身的vtkDICOMImageRead不支持压缩格式,因此我又打了一个GDCM(3.2.1版本,cmake是3.29.2)的三方库,用于读取dicom文件,但是在正式项目却用不了,说什么没有.dll文件(我看了一下bin文件夹,还真没有),不知道哪里出了问题,网上找了一圈也没找到,麻烦各位大佬看一看,万分感谢。 1.首先是cmake编译:

点击Configure之后的配置:

后续的VS构建以及安装都没有报错,最后也是成功生成了相关文件:

项目中我是放在了这:

使用的话主要是在civMain中使用的:

代码语言:txt
复制
# -------------------------------------------------------------
# GDCM  3rdparties.cmake
# -------------------------------------------------------------
# 根据平台与编译类型选择 GDCMConfig.cmake 路径
if(WIN32)
    if (CMAKE_BUILD_TYPE STREQUAL "Debug")
        set(_GDCM_DIR ${_3RD_ROOT}/gdcm/gdcm_3.2.1-Debug/lib/gdcm-3.2)
    else()
        set(_GDCM_DIR ${_3RD_ROOT}/gdcm/gdcm_3.2.1-Release/lib/gdcm-3.2)
    endif()
else()
    if (CMAKE_BUILD_TYPE STREQUAL "Debug")
        set(_GDCM_DIR ${_3RD_ROOT}/gdcm/gdcm_3.2.1-Debug/lib/gdcm-3.2)
    else()
        set(_GDCM_DIR ${_3RD_ROOT}/gdcm/gdcm_3.2.1-Release/lib/gdcm-3.2)
    endif()
endif ()
set(GDCM_DIR ${_GDCM_DIR} CACHE PATH "Path to GDCMConfig.cmake" FORCE)
find_package(GDCM REQUIRED)
add_library(3rdparty_GDCM INTERFACE)
add_library(3rdparty::GDCM ALIAS 3rdparty_GDCM)
# 使用 GDCM CMake 包生成的 IMPORTED 目标可确保链接时带有完整路径,避免找不到 lib 文件
target_include_directories(3rdparty_GDCM INTERFACE
        ${GDCM_INCLUDE_DIRS}
        ${GDCM_INCLUDE_DIRS}/vtk-9.0
)
target_link_directories(3rdparty_GDCM INTERFACE ${GDCM_LIBRARY_DIRS})
target_link_libraries(3rdparty_GDCM INTERFACE
        gdcmjpeg8
        gdcmjpeg12
        gdcmjpeg16
        gdcmexpat
        gdcmopenjp2
        gdcmcharls
        gdcmzlib
        gdcmgetopt
        socketxx
        gdcmCommon
        gdcmDICT
        gdcmDSED
        gdcmIOD
        gdcmMSFF
        gdcmMEXD
        vtkgdcm-9.0
)
message(${GDCM_INCLUDE_DIRS})
if(UNIX)
    # 1. 明确库目录
    get_filename_component(GDCM_LIB_DIR "${GDCM_INCLUDE_DIRS}/../lib/" ABSOLUTE)
    message(GDCM_LIB_DIR ${GDCM_LIB_DIR})
    # 2. 把 rpath 挂到 3rdparty_GDCM
    target_link_options(3rdparty_GDCM INTERFACE -Wl,-rpath,${GDCM_LIB_DIR})
    target_link_options(3rdparty_GDCM INTERFACE -Wl,-rpath-link,${GDCM_LIB_DIR})
endif()
代码语言:javascript
运行
复制
# 链接common库 + VTK 库
target_link_libraries(civMain PUBLIC
        3rdparty::GDCM
)
# Windows 平台下拷贝 需要的第三方库 DLL
if (WIN32 AND NOT DEFINED CMAKE_TOOLCHAIN_FILE)
    message(STATUS "正在拷贝QT DLL")
    set(DEBUG_SUFFIX)
    if (MSVC AND CMAKE_BUILD_TYPE MATCHES "Debug")
        set(DEBUG_SUFFIX "d")
    endif ()

    set(QT_INSTALL_PATH "${CMAKE_PREFIX_PATH}")
    if (NOT EXISTS "${QT_INSTALL_PATH}/bin")
        set(QT_INSTALL_PATH "${QT_INSTALL_PATH}/..")
        if (NOT EXISTS "${QT_INSTALL_PATH}/bin")
            set(QT_INSTALL_PATH "${QT_INSTALL_PATH}/..")
        endif ()
    endif ()

    # 平台插件
    if (EXISTS "${QT_INSTALL_PATH}/plugins/platforms/qwindows${DEBUG_SUFFIX}.dll")
        add_custom_command(TARGET civMain POST_BUILD
                COMMAND ${CMAKE_COMMAND} -E make_directory
                "$<TARGET_FILE_DIR:civMain>/plugins/platforms/")
        add_custom_command(TARGET civMain POST_BUILD
                COMMAND ${CMAKE_COMMAND} -E copy
                "${QT_INSTALL_PATH}/plugins/platforms/qwindows${DEBUG_SUFFIX}.dll"
                "$<TARGET_FILE_DIR:civMain>/plugins/platforms/")
    endif ()

    add_custom_command(TARGET civMain POST_BUILD
            COMMAND ${CMAKE_COMMAND} -E make_directory
            "$<TARGET_FILE_DIR:civMain>/plugins/imageformats/")
    add_custom_command(TARGET civMain POST_BUILD
            COMMAND ${CMAKE_COMMAND} -E copy
            "${QT_INSTALL_PATH}/plugins/imageformats/qjpeg${DEBUG_SUFFIX}.dll"
            "$<TARGET_FILE_DIR:civMain>/plugins/imageformats/")

    # 常用 Qt DLL
    foreach (QT_LIB Core Gui Widgets Network WebSockets Concurrent)
        add_custom_command(TARGET civMain POST_BUILD
                COMMAND ${CMAKE_COMMAND} -E copy
                "${QT_INSTALL_PATH}/bin/Qt5${QT_LIB}${DEBUG_SUFFIX}.dll"
                "$<TARGET_FILE_DIR:civMain>")
    endforeach ()

    # ---------------- 拷贝 GDCM DLL ----------------
    message(STATUS "配置拷贝 GDCM DLL 指令 (按构建配置自动切换)")
    add_custom_command(TARGET civMain POST_BUILD
            COMMAND ${CMAKE_COMMAND} -E copy_directory
            "${PROJECT_SOURCE_DIR}/3rd/windows/gdcm/gdcm_3.2.1-$<CONFIG>/bin"
            "$<TARGET_FILE_DIR:civMain>")

endif ()

写在项目中的代码没有报红,按住ctrl也是能正常进去的:

但是一旦运行就会说这个dll找不到,项目也跑不起来:

看之前的图片,我打的库里面确实没有这个文件,是我打的库有问题吗,还是什么原因,恳请大佬解答,万分感谢!

回答

和开发者交流更多问题细节吧,去 写回答
相关文章

相似问题

相关问答用户
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档