cmake - 使用 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 库中的任何内容时,这都会导致无法解析的外部符号。
其他信息
- 我能够做的唯一成功的事情是包含 headers 目录,以便智能识别我什么时候
#include <heif.h>
- 我已经全面了解如何包含 dll 和库,但是所有结果要么需要我使用 cmake GUI,我不确定我是否可以,因为我正在与其他人一起从事这个项目,我想确保它可以在他们的计算机上运行,而无需使用 cmake GUI。
- 与仅使用 vcpkg 包含它相同,我不希望我的队友也必须使用它,我只需要使用 CMakeLists.txt
- 本教程会很有帮助,但是生成的东西在我头上,我找不到生成的意思。这可能是我松了一天的兔子洞。
- 我正在使用 Windows 10,我最终需要制作它以便它可以在 OSX 上构建,但我现在只是想让它在 Windows 上运行。
我试图理解为什么这些方法都失败了。我宁愿走上尝试#2 的道路,因为当我需要让它为 mac 编译时,我觉得这对以后的道路更好。谢谢你。
解决方案
然后在 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 :将链接目录添加到目标。
推荐阅读
- angular - 根据状态更改多垫子进度条颜色?
- java - 将随机值分配给数组的问题
- python - 我不懂简单的二进制解码器代码。这段代码如何运作良好?
- r - R法线图中的阴影
- r - 带有 nginx/Ubuntu 20.04.1 和自定义域的闪亮应用程序/闪亮服务器
- python - 尝试在 Raspberry Pi 3 上使用旧版本的 Praw 时出错
- java - WebSphere 9 - com.ibm.websphere.management.exception.AdminException:
- android - Okhttp 总是返回错误 404,但在 windows 上的 chrome 中完美运行
- php - PHP 钠解密返回 False
- javascript - 无法使用 phantomjs 加载 Instagram 登录页面