首页 > 解决方案 > 使用 cmake 将 libheif 作为外部依赖项包含到项目中

问题描述

我正在尝试使用 cmake将libheif包含到我的项目中。Libheif 比我以前使用的更复杂,因为它需要您在外部构建并包含 libde265。

尝试#1:

我已经使用 vcpkg 导出预构建的二进制包,这会创建一个名为 libheif 的目录,其中包含此处的所有内容:

+---bin
|       heif.dll
|       libde265.dll
|       libx265.dll
|       libx265.pdb
|       
+---debug
|   +---bin
|   |       heif.dll
|   |       libde265.dll
|   |       libx265.dll
|   |       libx265.pdb
|   |       
|   \---lib
|       |   heif.lib
|       |   libde265.lib
|       |   libx265.lib
|       |   x265-static.lib
|       |   
|       \---pkgconfig
|               libheif.pc
|               x265.pc
|               
+---include
|   |   x265.h
|   |   x265_config.h
|   |   
|   +---libde265
|   |       de265.h
|   |       
|   \---libheif
|           heif.h
|           
+---lib
|   |   heif.lib
|   |   libde265.lib
|   |   libx265.lib
|   |   x265-static.lib
|   |   
|   \---pkgconfig
|           libheif.pc
|           x265.pc
|           
+---share
|   +---libde265
|   |       copyright
|   |       libde265Config-debug.cmake
|   |       libde265Config-release.cmake
|   |       libde265Config.cmake
|   |       libde265ConfigVersion.cmake
|   |       vcpkg_abi_info.txt
|   |       
|   +---libheif
|   |   |   copyright
|   |   |   libheif-config-debug.cmake
|   |   |   libheif-config-release.cmake
|   |   |   libheif-config-version.cmake
|   |   |   libheif-config.cmake
|   |   |   vcpkg_abi_info.txt
|   |   |   
|   |   \---.vs
|   |           ProjectSettings.json
|   |           slnx.sqlite
|   |           
|   \---x265
|           copyright
|           vcpkg_abi_info.txt
|           
\---tools
    +---libde265
    |       dec265.exe
    |       enc265.exe
    |       libde265.dll
    |       
    \---x265
            x265.exe
            

(有更多标题,我删除了它们,因为一个说明了这一点)我将文件libheif夹放在我项目的外部文件夹中。然后在CMakeLists.txt我尝试使用

target_link_libraries(my_project ${CMAKE_SOURCE_DIR}/external/libheif/lib/heif)

然后无法查找heif.obj不存在的文件。它确实找到了 dll。

失败后,我再次尝试,这次使用共享目录中的 .cmake 文件:

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/external/libheif/share/libheif)
list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/external/libheif/share/libde265)

include(libheif-config)
include(libde265Config)

当我尝试在 libheif 中使用任何东西时,我得到了无法解析的外部符号。

尝试#2:

我尝试通过将 libeheif 添加为子模块来包含它git submodule add https://github.com/strukturag/libheif.git external/libheif ,然后在其中CMakeLists.txt添加:

include_directories(external/libheif/include)
include_directories(external/libheif/include/libheif)
include_directories(external/libheif/include/libde265)
add_subdirectory(external/libheif)
target_link_libraries(my_project libheif)

每当我尝试使用 libheif 库中的任何内容时,这都会导致无法解析的外部符号。

其他信息

我试图理解为什么这些方法都失败了。我宁愿走上尝试#2 的道路,因为当我需要让它为 mac 编译时,我觉得这对以后的道路更好。谢谢你。

标签: cmake

解决方案


然后在 CMakeLists.txt 我尝试使用: target_link_libraries(my_project ${CMAKE_SOURCE_DIR}/external/libheif/lib/heif)

我认为你应该使用:

target_link_directories( ${PROJECT_NAME}
    PRIVATE ./external/libheif/lib/heif
)

target_link_libraries( ${PROJECT_NAME} PRIVATE
    heif
    xxx
)

target_link_directories :将链接目录添加到目标。


推荐阅读