【问题标题】:Android, CMake and Static LinkingAndroid、CMake 和静态链接
【发布时间】:2017-06-13 01:13:02
【问题描述】:

在按照 Google hello-libs example 将库项目构建从 Android.mk 转换为 CMakeLists.txt 时,我遇到了避免未定义引用的问题。我正在使用一个名为 DCMTK 的开源项目,并将 DCMTK 和 ICONV 编译为静态库,然后我将其链接。使用 Android.mk 构建通过 ndk-build 工作,并使用 gradle 和以下 @ 构建它们当我将每个静态库添加到target_link_libraries 时,987654329@ 有效。但是,我想使用add_library 来完成这项工作并尝试了

add_library( lib_dcmdata STATIC IMPORTED )
set_target_properties( lib_dcmdata
                           PROPERTIES
                           IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libdcmdata.a )

对于每个库,然后将它们添加到 target_link_libraries。这导致了大量未定义的引用。我还尝试通过将静态库分组到一个目标中来设置目标属性,但这也不起作用。

依赖链接的顺序是否有所不同,或者 CMake 使用 add_library set_target_properties 方法处理这些库的方式不同?

CMakeLists.txt

cmake_minimum_required( VERSION 3.6 )
project( dicom-jni )

set( SOURCE_FILES
         dicom.cpp
         dicom.hpp )

add_library( lib_dcmtk STATIC IMPORTED )
set_target_properties( lib_dcmtk
                           PROPERTIES
                           IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libdcmrt.a
                           IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libdcmpstat.a
                           IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libdcmqrdb.a
                           IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libdcmwlm.a
                           IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libdcmdsig.a
                           IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libdcmnet.a
                           IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libdcmjpeg.a
                           IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libdcmjpls.a
                           IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libcharls.a
                           IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libijg16.a
                           IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libijg12.a
                           IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libijg8.a
                           IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libdcmimage.a
                           IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libdcmimgle.a
                           IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libi2d.a
                           IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libdcmdata.a
                           IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/liboflog.a
                           IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libofstd.a )

add_library( lib_iconv STATIC IMPORTED )
set_target_properties( lib_iconv
                           PROPERTIES
                           IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/iconv/${ANDROID_ABI}/lib/libiconv.a
                           IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/iconv/${ANDROID_ABI}/lib/libcharset.a )

find_library( lib_jnigraphics jnigraphics )
find_library( lib_android-log log )

add_library( dicom-jni SHARED ${SOURCE_FILES} )

target_include_directories( dicom-jni PRIVATE
                                prebuilt_libs/dcmtk/${ANDROID_ABI}/include
                                prebuilt_libs/iconv/${ANDROID_ABI}/include
                                logger )

target_link_libraries( dicom-jni
                           ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libdcmrt.a
                           ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libdcmpstat.a
                           ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libdcmqrdb.a
                           ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libdcmwlm.a
                           ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libdcmdsig.a
                           ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libdcmnet.a
                           ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libdcmjpeg.a
                           ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libdcmjpls.a
                           ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libcharls.a
                           ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libijg16.a
                           ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libijg12.a
                           ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libijg8.a
                           ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libdcmimage.a
                           ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libdcmimgle.a
                           ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libi2d.a
                           ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libdcmdata.a
                           ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/liboflog.a
                           ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libofstd.a
                           ${CMAKE_SOURCE_DIR}/prebuilt_libs/iconv/${ANDROID_ABI}/lib/libiconv.a
                           ${CMAKE_SOURCE_DIR}/prebuilt_libs/iconv/${ANDROID_ABI}/lib/libcharset.a
                           z
                           dl
                           stdc++
                           ${lib_jnigraphics}
                           ${lib_android-log} )

【问题讨论】:

    标签: android-ndk cmake


    【解决方案1】:

    虽然我不确定是否要整体添加所有静态库的 IMPORTED_LOCATION,但将工作依赖顺序分解为库确实有效。您可以使用 for 循环或编写函数或两者兼而有之,轻松改进此代码。

    cmake_minimum_required( VERSION 3.6 )
    project( dicom-jni )
    
    set( SOURCE_FILES
             dicom.cpp
             dicom.hpp )
    
    add_library( lib_dcmrt STATIC IMPORTED )
    set_target_properties( lib_dcmrt
                               PROPERTIES
                               IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libdcmrt.a )
    
    add_library( lib_dcmpstat STATIC IMPORTED )
    set_target_properties( lib_dcmpstat
                               PROPERTIES
                               IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libdcmpstat.a )
    
    add_library( lib_dcmqrdb STATIC IMPORTED )
    set_target_properties( lib_dcmqrdb
                               PROPERTIES
                               IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libdcmqrdb.a )
    
    add_library( lib_dcmwlm STATIC IMPORTED )
    set_target_properties( lib_dcmwlm
                               PROPERTIES
                               IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libdcmwlm.a )
    
    add_library( lib_dcmdsig STATIC IMPORTED )
    set_target_properties( lib_dcmdsig
                               PROPERTIES
                               IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libdcmdsig.a )
    
    add_library( lib_dcmnet STATIC IMPORTED )
    set_target_properties( lib_dcmnet
                               PROPERTIES
                               IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libdcmnet.a )
    
    add_library( lib_dcmjpeg STATIC IMPORTED )
    set_target_properties( lib_dcmjpeg
                               PROPERTIES
                               IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libdcmjpeg.a )
    
    add_library( lib_dcmjpls STATIC IMPORTED )
    set_target_properties( lib_dcmjpls
                               PROPERTIES
                               IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libdcmjpls.a )
    
    add_library( lib_charls STATIC IMPORTED )
    set_target_properties( lib_charls
                               PROPERTIES
                               IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libcharls.a )
    
    add_library( lib_ijg16 STATIC IMPORTED )
    set_target_properties( lib_ijg16
                               PROPERTIES
                               IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libijg16.a )
    
    add_library( lib_ijg12 STATIC IMPORTED )
    set_target_properties( lib_ijg12
                               PROPERTIES
                               IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libijg12.a )
    
    add_library( lib_ijg8 STATIC IMPORTED )
    set_target_properties( lib_ijg8
                               PROPERTIES
                               IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libijg8.a )
    
    add_library( lib_dcmimage STATIC IMPORTED )
    set_target_properties( lib_dcmimage
                               PROPERTIES
                               IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libdcmimage.a )
    
    add_library( lib_dcmimgle STATIC IMPORTED )
    set_target_properties( lib_dcmimgle
                               PROPERTIES
                               IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libdcmimgle.a )
    
    add_library( lib_i2d STATIC IMPORTED )
    set_target_properties( lib_i2d
                               PROPERTIES
                               IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libi2d.a )
    
    add_library( lib_dcmdata STATIC IMPORTED )
    set_target_properties( lib_dcmdata
                               PROPERTIES
                               IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libdcmdata.a )
    
    add_library( lib_oflog STATIC IMPORTED )
    set_target_properties( lib_oflog
                               PROPERTIES
                               IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/liboflog.a )
    
    add_library( lib_ofstd STATIC IMPORTED )
    set_target_properties( lib_ofstd
                               PROPERTIES
                               IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/dcmtk/${ANDROID_ABI}/lib/libofstd.a )
    
    add_library( lib_iconv STATIC IMPORTED )
    set_target_properties( lib_iconv
                               PROPERTIES
                               IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/iconv/${ANDROID_ABI}/lib/libiconv.a )
    
    add_library( lib_charset STATIC IMPORTED )
    set_target_properties( lib_charset
                               PROPERTIES
                               IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/prebuilt_libs/iconv/${ANDROID_ABI}/lib/libcharset.a )
    
    find_library( lib_jnigraphics jnigraphics )
    find_library( lib_android-log log )
    
    add_library( dicom-jni SHARED ${SOURCE_FILES} )
    
    target_include_directories( dicom-jni PRIVATE
                                    prebuilt_libs/dcmtk/${ANDROID_ABI}/include
                                    prebuilt_libs/iconv/${ANDROID_ABI}/include
                                    logger )
    
    target_link_libraries( dicom-jni
                               lib_dcmrt
                               lib_dcmpstat
                               lib_dcmqrdb
                               lib_dcmwlm
                               lib_dcmdsig
                               lib_dcmnet
                               lib_dcmjpeg
                               lib_dcmjpls
                               lib_charls
                               lib_ijg16
                               lib_ijg12
                               lib_ijg8
                               lib_dcmimage
                               lib_dcmimgle
                               lib_i2d
                               lib_dcmdata
                               lib_oflog
                               lib_ofstd
                               lib_iconv
                               lib_charset
                               z
                               dl
                               stdc++
                               ${lib_jnigraphics}
                               ${lib_android-log} )
    

    【讨论】:

      猜你喜欢
      • 2013-06-04
      • 2017-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 2022-07-15
      • 2013-03-09
      相关资源
      最近更新 更多