Exiv2/exiv2

GitHub: Exiv2/exiv2

Exiv2 是一个跨平台的 C++ 图像元数据操作库及命令行工具,专注于读写和修改 Exif、IPTC、XMP 和 ICC 等多种格式的图像元数据。

Stars: 1107 | Forks: 314

| Codecov | OSS-Fuzz | Repology | 聊天 | | :----------------------------------------------------------: | :----------------------------------------------------------: | :----------------------------------------------------------: | :----------------------------------------------------------: | | [![codecov](https://codecov.io/gh/Exiv2/exiv2/branch/main/graph/badge.svg?token=O9G7Iswx26)](https://codecov.io/gh/Exiv2/exiv2) | [![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/exiv2.svg)](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:exiv2) | [![Packaging status](https://repology.org/badge/tiny-repos/exiv2.svg)](https://repology.org/metapackage/exiv2/versions) | [![#exiv2-chat on matrix.org](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/c265029661111121.png)](https://matrix.to/#/#exiv2-chat:matrix.org) | | **CI 状态:** | | | | |:-- |:-- |:-- |:-- | | [![Release](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/0ba04a7930111121.svg)](https://github.com/Exiv2/exiv2/actions/workflows/release.yml) | [![Basic jobs for all platforms](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/19f5255fd9111122.svg)](https://github.com/Exiv2/exiv2/actions/workflows/on_push_BasicWinLinMac.yml) | [![Nightly jobs for Linux distributions](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/6b91063cef111123.svg)](https://github.com/Exiv2/exiv2/actions/workflows/nightly_Linux_distributions.yml) | [![On PUSH - Linux Special Builds for main branch](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/9976c07161111124.svg)](https://github.com/Exiv2/exiv2/actions/workflows/on_push_ExtraJobsForMain.yml) |
# 欢迎使用 Exiv2 ![Exiv2](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/b7d1f28335111124.png) Exiv2 是一个 C++ 库和一个命令行实用程序,用于读取、写入、删除和修改 Exif、IPTC、XMP 和 ICC 图像元数据。 | Exiv2 资源 | 位置 | |:---------- |:------ | | 发布版本和文档
预发布版本:
项目资源
许可证 (GPLv2)
CMake 下载 | [https://exiv2.org](https://exiv2.org)
[https://pre-release.exiv2.org](https://pre-release.exiv2.org)
[https://github.com/Exiv2/exiv2](https://github.com/Exiv2/exiv2)
[COPYING](COPYING)
[https://cmake.org/download/](https://cmake.org/download/) | | README.md
README-CONAN.md
README-SAMPLES.md | 用户手册。_本文档_
Conan 用户手册 _[点击这里](README-CONAN.md)_
示例代码手册。_[点击这里](README-SAMPLES.md)_ | 构建包中的 ReadMe.txt 文件描述了如何在平台上安装该库。ReadMe.txt 还记录了如何在平台上编译和链接代码。
# 目录 - [欢迎使用 Exiv2](#Welcome) - [构建、安装、使用和卸载 Exiv2](#B_I_U) - [在类 UNIX 系统上构建、安装、使用和卸载 Exiv2](#B_I_U_Unix) - [使用 Visual Studio 构建和安装 Exiv2](#B_I_U_VisualStudio) - [使用 CMake 预设配置项目](#CMakePresets) - [构建选项](#BuildOptions) - [依赖项](#Dependencies) - [使用 Exiv2 构建和链接您的代码](#BuildAndLinkYourCode) - [通过 CMake 使用 Exiv2](#ConsumeExiv2WithCmake) - [使用 pkg-config 编译和链接您的代码与 Exiv2](#ConsumeWithPkgConfig) - [本地化](#Localisation) - [构建 Exiv2 文档](#BuildDoc) - [构建 Exiv2 标签网页](#BuildTagWebpages) - [构建 Exiv2 包](#GeneratePackages) - [调试 Exiv2](#Debugging) - [使用 Clang 和其他构建链构建 Exiv2](#BuildWithClangAndOthers) - [使用 ccache 构建 Exiv2](#CCache) - [线程安全](#ThreadSafety) - [库初始化和清理](#InitAndCleanup) - [在 Linux 上为 MinGW 进行跨平台构建和测试](#CrossPlatformSupport) - [静态和共享库](#StaticShared) - [对 BMFF 文件的支持(例如 CR3, HEIF, HEIC, AVIF 和 JPEG XL)](#BMFF) - [许可证和支持](#LicenseSupport) - [许可证](#License) - [支持](#Support) - [测试套件](#TestSuite) - [Exiv2 环境变量](#EnvironmentVariables) - [在类 UNIX 系统上运行测试](#TestsOnUnix) - [在 Visual Studio 构建版本上运行测试](#TestsOnVisualStudio) - [单元测试](#UnitTests) - [错误修复测试](#BugfixTests) - [模糊测试 (Fuzzing)](#FuzzingTests) - [OSS-Fuzz](#OssFuzz) - [平台说明](#PlatformNotes) - [Linux](#PlatformLinux) - [macOS](#PlatformMacOs) - [MinGW/msys2](#PlatformMinGWMSYS) - [Cygwin](#PlatformCygwin) - [Visual Studio](#PlatformVisualStudio) - [Unix](#PlatformUnix) [TOC](#TOC)
# 构建、安装、使用和卸载 Exiv2 您需要 [CMake](https://cmake.org/download/) 来配置 Exiv2 项目,任何实现 C++ 20 标准的 C++ 编译器以及相关的工具链。
## 在类 UNIX 系统上构建、安装、使用 Exiv2 ``` $ cd ~/gnu/github/exiv2 # Location of the project code $ cmake -S . -B build -DCMAKE_BUILD_TYPE=Release # Configure the project with CMake $ cmake --build build # Compile the project $ ctest --test-dir build --verbose # Run tests $ sudo cmake --install build # Run the install target (install library, public headers, application and CMake files) ``` 这会将库安装到“标准位置”。库将被安装在 `/usr/local/lib`,可执行文件(包括 exiv2 命令行程序)在 `/usr/local/bin/`,头文件在 `/usr/local/include/exiv2`。安装的目标目录可以使用 CMake 选项 `-DCMAKE_INSTALL_PREFIX` 进行修改。 CMake 从源代码目录分析项目配置,并将文件生成到构建目录中。它生成构建 exiv2 库和命令行应用程序(以及可选的示例应用程序和测试运行器)所需的项目/解决方案/makefile。CMake 还会创建文件 `exv_conf.h` 和 `exiv2lib_export.h`,其中包含有关您选择的构建选项以及您机器上库可用性的编译器指令。 ### 使用 exiv2 命令行程序 要执行 exiv2 命令行程序,您应该更新您的路径以搜索 /usr/local/bin/ ``` $ export PATH="/usr/local/bin:$PATH" ``` 您还需要在运行时定位 libexiv2: ``` $ export LD_LIBRARY_PATH="/usr/local/lib:$LD_LIBRARY_PATH" # Linux, Cygwin, MinGW/msys2 $ export DYLD_LIBRARY_PATH="/usr/local/lib:$DYLD_LIBRARY_PATH" # macOS ``` ### 卸载 我不知道为什么会有人想要卸载 Exiv2。 ``` $ cd ~/gnu/github/exiv2 # location of the project code $ cmake --build build --target uninstall ``` 这些命令将运行 `uninstall` 目标并删除由 `install` 目标安装的所有文件。 请注意,此机制并不完美,它无法删除在安装路径中创建的子目录。 [TOC](#TOC)
## 使用 Visual Studio 构建和安装 Exiv2 我们建议在 Windows 上使用 conan 下载 Exiv2 的外部依赖项。在其他平台(macOS、Linux 等)上,传统上使用平台包管理器。但是,conan 可以在任何平台/架构上用于引入项目依赖项。这些在 [平台说明](#PlatformNotes) 中进行了讨论。使用 Visual Studio 配置和编译项目的选项与类 UNIX 系统类似。 有关 Conan 的更多信息,请参阅 [README-CONAN](README-CONAN.md)。 构建时,您可以使用以下命令进行安装。 ``` > cmake --install build ``` 这将创建 exiv2 构建产物并将其复制到 `%ProgramFiles%/exiv2`。为了能够从任何终端运行 `exiv2` 命令行应用程序,您应该修改您的路径以包含 `%ProgramFiles%/exiv2/bin`。 [TOC](#TOC)
## 使用 CMake 预设配置项目 CMake 预设(见文档 [这里](https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html))最近被添加到项目中,以简化典型配置的 CMake 配置过程。预设定义在文件 `CMakePresets.json` 中,可以从终端使用或由不同的 IDE 解释。请注意,需要使用支持预设功能的最新版本的 CMake (>= 3.21)。 可以使用 `--list-presets` 选项列出可用的预设: ``` # 从 Windows 终端运行命令 $ cmake --list-presets Available configure presets: "msvc" - Visual Studio cl toolchain (also usable from VS Code) "win-debug" - Windows Debug with configured architecture "win-release" - Windows Release with configured architecture # 从 Linux 终端运行命令 $ cmake --list-presets Available configure presets: "linux-debug" - Linux Debug with default architecture "linux-release" - Linux Release with default architecture ``` 可以使用 CMake `--preset` 选项选择具有特定预设的项目配置。在以下终端输出中,我们注释了项目配置期间发生的一些有趣的事情: ``` # 使用 preset 配置项目 $ cmake --preset win-release Preset CMake variables: # 注意,使用 preset 时,我们会向 CMake 传递许多不同的选项。 BUILD_SHARED_LIBS:BOOL="TRUE" CMAKE_BUILD_TYPE="Release" CMAKE_INSTALL_PREFIX:PATH="C:/dev/personal/exiv2/build-win-release/install" # A build & install directory are configured with the preset CONAN_AUTO_INSTALL:BOOL="TRUE" EXIV2_BUILD_SAMPLES:BOOL="TRUE" EXIV2_BUILD_UNIT_TESTS:BOOL="TRUE" EXIV2_ENABLE_BMFF:BOOL="TRUE" EXIV2_ENABLE_CURL:BOOL="TRUE" EXIV2_ENABLE_NLS:BOOL="FALSE" EXIV2_ENABLE_VIDEO:BOOL="TRUE" EXIV2_ENABLE_PNG:BOOL="TRUE" EXIV2_ENABLE_WEBREADY:BOOL="TRUE" EXIV2_TEAM_WARNINGS_AS_ERRORS:BOOL="TRUE" # Conan 可在您的系统中被自动检测,并自动运行以引入 # 项目依赖项 -- Conan: Detected VS runtime: MD -- Conan: checking conan executable -- Conan: Found program C:/dev/envs/conan/Scripts/conan.exe -- Conan: Version found Conan version 1.47.0 -- Conan executing: C:/dev/envs/conan/Scripts/conan.exe install .. --remote conancenter --build missing --options webready=True --settings arch=x86_64 --settings build_type=Release --settings compiler=Visual Studio --settings compiler.version=20 --settings compiler.runtime=MD ... # CMake 查找由 conan 自动处理的项目依赖项 -- Conan: Using autogenerated FindZLIB.cmake -- Library zlib found C:/Users/luis/.conan/data/zlib/1.2.11/_/_/package/ -- Conan: Using autogenerated FindCURL.cmake -- Library libcurl_imp found C:/Users/luis/.conan/data/libcurl/7.79.0/_/_/package/ ... # CMake 完成项目配置并打印报告 -- Install prefix: C:/dev/personal/exiv2/build-win-release/install -- ------------------------------------------------------------------ -- CMake Generator: Ninja -- CMAKE_BUILD_TYPE: Release -- Compiler info: MSVC (C:/Program Files/Microsoft Visual Studio/2022/Professional/VC/Tools/MSVC/14.30.30705/bin/Hostx64/x64/cl.exe) ; version: 19.30.30705.0 -- CMAKE_CXX_STANDARD:20 -- --- Compiler flags --- -- General: /DWIN32 /D_WINDOWS /W3 /GR /EHsc /MP /utf-8 /WX -- Extra: -- Debug: /MDd /Zi /Ob0 /Ox /Zo -- Release: /MD /O2 /DNDEBUG -- RelWithDebInfo: /MD /Zi /O2 /DNDEBUG -- MinSizeRel: /MD /O1 /DNDEBUG -- --- Linker flags --- -- General: /machine:x64 /WX -- Debug: /debug /INCREMENTAL -- Release: /INCREMENTAL:NO -- RelWithDebInfo: /debug /INCREMENTAL -- MinSizeRel: /INCREMENTAL:NO -- ... -- Build files have been written to: C:/dev/personal/exiv2/build-win-release ``` 请注意,使用 CMake 预设允许项目贡献者在不同的环境中(使用终端、IDE 或 CI)轻松使用同一组选项。 [TOC](#TOC)
## 构建选项 有两组与项目相关的 CMake 选项:全局 CMake 选项和项目特定选项。以下是一些特别有用的全局选项: | 选项 | 用途 (_默认值_) | |:------------- |:------------- | | CMAKE\_INSTALL\_PREFIX
CMAKE\_BUILD\_TYPE
BUILD\_SHARED\_LIBS | 在计算机上的安装位置 _**(/usr/local)**_
构建类型 _**(Release)**_ 参见:[调试 Exiv2](#Debugging)
将 exiv2lib 构建为 SHARED 或 STATIC | 在 `exiv2/CMakeLists.txt` 中定义的选项包括: ``` 576 rmills@rmillsmm:~/gnu/github/exiv2/exiv2 $ grep ^option CMakeLists.txt option( BUILD_SHARED_LIBS "Build exiv2lib as a shared library" ON ) option( EXIV2_ENABLE_XMP "Build with XMP metadata support" ON ) option( EXIV2_ENABLE_EXTERNAL_XMP "Use external version of XMP" OFF ) option( EXIV2_ENABLE_PNG "Build with png support (requires libz)" ON ) ... option( EXIV2_ENABLE_BMFF "Build with BMFF support (brotli recommended)" ON ) option( EXIV2_ENABLE_BROTLI "Use Brotli for JPEG XL compressed boxes (BMFF)" ON ) option( EXIV2_ENABLE_FILESYSTEM_ACCESS "Build with filesystem access" ON ) 577 rmills@rmillsmm:~/gnu/github/exiv2/exiv2 $ ``` 使用命令行,可以使用选项 `-D` 设置/更新这些变量: ``` $ cmake -DBUILD_SHARED_LIBS=ON -DEXIV2_ENABLE_NLS=OFF ``` [TOC](#TOC)
## 依赖项 以下 Exiv2 功能需要外部库: | 功能 | 包 | 默认值 | 更改默认值 | 可用性 | |:------------------------ |:-------- |:-------:|:--------------------------- |:------------ | | PNG 图像支持 | zlib | ON | -DEXIV2\_ENABLE\_PNG=OFF | [https://zlib.net/](https://zlib.net/) | | XMP 支持 | expat | ON | -DEXIV2\_ENABLE\_XMP=OFF | [https://libexpat.github.io/](https://libexpat.github.io/)
使用 _**Expat 2.2.6**_ 及更高版本 | | 自然语言系统 | gettext | OFF | -DEXIV2\_ENABLE\_NLS=ON | [https://www.gnu.org/software/gettext/](https://www.gnu.org/software/gettext/) | | JPEG XL brob 支持 | brotli | ON | -DEXIV2\_ENABLE\_BROTLI=OFF | [https://github.com/google/brotli](https://github.com/google/brotli) | | 字符集转换 | libiconv | | Visual Studio 禁用。
在类 UNIX 平台上安装后链接。 | [https://www.gnu.org/software/libiconv/](https://www.gnu.org/software/libiconv/) | 在 UNIX 系统上,您可以使用发行版的包管理系统安装依赖项。安装依赖项的开发包以安装构建 Exiv2 所需的头文件和库。脚本 `ci/install_dependencies.sh` 用于设置我们构建和测试 Exiv2 的 CI 映像。您可能会发现这有助于设置您的平台依赖项。 自然语言系统在这里有更详细的讨论:[本地化](#Localisation) 关于不同平台的说明包含在这里:[平台说明](#PlatformNotes) 您可以选择使用 conan 安装依赖项。所有平台都支持此功能,对于 Visual Studio 用户尤其有用。 有关更多信息,请参阅 [README-CONAN](README-CONAN.md)。 ### Libiconv 库 libiconv 用于在标签 Exif.Photo.UserComment、Exif.GPSInfo.GPSProcessingMethod 和 Exif.GPSInfo.GPSAreaInformation 中执行字符集编码。这在 [exiv2 man page](exiv2.md) 中有记录。 CMake 将检测所有类 UNIX 系统(包括 Linux、macOS、UNIX、Cygwin64 和 MinGW/msys2)上的 libiconv。如果您在机器上安装了 libiconv,Exiv2 将链接并使用它。 库 libiconv 是一个 GNU 库,我们不建议在使用 Visual Studio 构建时将 libiconv 与 Exiv2 一起使用。 [TOC](#TOC)
## 使用 Exiv2 构建和链接您的代码 关于编译和链接的详细平台说明位于 `releasenotes/{platform}/ReadMe.txt` 其中 `platform: { CYGWIN | Darwin | Linux | MinGW | msvc | Unix }` 通常您需要执行以下操作: 1. 应用程序代码应至少用 C++14 编写,并包含 exiv2 头文件 ``` #include ``` 2. 使用以下指令编译您的 C++ 代码:**`-I/usr/local/include`** 3. 使用链接器选项将您的代码与 libexiv2 链接:**`-lexiv2`** 和 **`-L/usr/local/lib`** 以下是构建并与 libexiv2 链接的典型命令: ``` $ g++ -std=c++20 myprog.cpp -o myprog -I/usr/local/include -L/usr/local/lib -lexiv2 ``` [TOC](#TOC)
## 通过 CMake 使用 Exiv2 安装 exiv2 后,通过 CMake 使用 Exiv2 所需的文件将安装在 `${CMAKE_INSTALL_PREFIX}/lib/cmake/exiv2` 您可以按如下方式构建 samples/exifprint.cpp: ``` $ cd $ mkdir exifprint $ cd exifprint $ cat - > CMakeLists.txt < ## 使用 pkg-config 编译和链接您的代码与 Exiv2 安装 exiv2 后,pkg-config 使用的文件 exiv2.pc 将安装在 `${CMAKE_INSTALL_PREFIX}/lib/pkgconfig`。您需要在您的环境中设置以下内容: ``` $ export PKG_CONFIG_PATH="/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH" ``` 要使用 exiv2.pc 进行编译和链接,通常将以下内容添加到您的 Makefile 中。 ``` PKGCONFIG=pkg-config CPPFLAGS := `pkg-config exiv2 --cflags` LDFLAGS := `pkg-config exiv2 --libs` ``` 如果您不使用 make,您可以按如下方式使用 pkg-config: ``` g++ -std=c++20 myprogram.cpp -o myprogram $(pkg-config exiv2 --libs --cflags) ``` [TOC](#TOC)
## 本地化 类 UNIX 平台支持本地化:Linux、macOS、Cygwin 和 MinGW/msys2。Visual Studio 构建不支持本地化。 Crowdin 为 Exiv2 提供了免费的开源许可证以使用其服务。Exiv2 本地化项目位于 [https://crowdin.com/project/exiv2](https://crowdin.com/project/exiv2)。您还需要在 Crowdin 上注册一个免费的用户帐户。Crowdin 设置在此处讨论:[https://github.com/Exiv2/exiv2/issues/1510](https://github.com/Exiv2/exiv2/issues/1510)。建议您在 Crowdin 上贡献本地化更改之前与 Leonardo 进行协调。您可以通过 GitHub 联系 Leonardo。 要构建本地化支持,请使用 CMake 选项 `-DEXIV2_ENABLE_NLS=ON`。您必须使用包管理器或从源代码安装 `gettext` 包。`gettext` 包可从 [https://www.gnu.org/software/gettext/](https://www.gnu.org/software/gettext/) 获取,其中包括库 `libintl` 和用于构建本地化文件的实用程序。如果 CMake 生成提到 libintl 或 gettext 的错误消息,您应该验证包 `gettext` 是否已正确构建和安装。 您必须安装构建以测试本地化。这确保可以在运行时找到本地化消息文件。您不能在目录 `build\bin` 中测试本地化。 1. 以另一种语言运行 exiv2 ``` $ env LANG=fr_FR exiv2 # env LANGUAGE=fr_FR exiv2 on Linux! exiv2: Une action doit être spécifié exiv2: Au moins un fichier est nécessaire Utilisation : exiv2 [ option [ arg ] ]+ [ action ] fichier ... Image metadata manipulation tool. $ ``` 2. 向 exiv2 添加其他语言 为了支持我们将在此讨论中指定为 'xy' 的新语言: 2.1) 从 po 模板生成一个 po 文件: ``` $ cd $ mkdir -p po/xy $ msginit --input=po/exiv2.pot --locale=xy --output=po/xy.po ``` 2.2) 编辑/翻译 po/xy.po 中的字符串 我编辑了以下内容: ``` #: src/exiv2.cpp:237 msgid "Image metadata manipulation tool.\n" msgstr "" ``` 为: ``` #: src/exiv2.cpp:237 msgid "Image metadata manipulation tool.\n" msgstr "Manipulate image metadata.\n" ``` 2.3) 生成消息文件: ``` $ mkdir -p po/xy/LC_MESSAGES $ msgfmt --output-file=po/xy/LC_MESSAGES/exiv2.mo po/xy.po ``` 2.4) 安装并测试您的消息: 您必须安装您的消息才能测试它们。无法通过执行 build/bin/exiv2 来测试消息文件。 ``` $ sudo mkdir -p /usr/local/share/locale/xy/LC_MESSAGES $ sudo cp -R po/xy/LC_MESSAGES/exiv2.mo /usr/local/share/locale/xy/LC_MESSAGES $ env LANG=xy exiv2 # env LANGUAGE=xy on Linux! exiv2: An action must be specified exiv2: At least one file is required Usage: exiv2 [ option [ arg ] ]+ [ action ] file ... Manipulate image metadata. <--------- Edited message! $ ``` 2.5) 提交您的新语言文件以包含在 Exiv2 的未来版本中: 您可以提交包含 po/xy.po 和对 po/CMakeLists.txt 的修改的 PR 或者,在 https://github.com/exiv2/exiv2 上打开一个新问题并附上文件 xy.po.zip,该文件可以按如下方式创建: ``` $ zip xy.po.zip po/xy.po adding: po/xy.po (deflated 78%) ls -l xy.po.zip -rw-r--r--+ 1 rmills staff 130417 25 Jun 10:15 xy.po.zip $ ``` [TOC](#TOC)
## 构建 Exiv2 文档 构建文档需要安装特殊工具。您可能更愿意 从项目网站在线阅读文档:https://exiv2.org 要构建文档,请使用 CMake 选项 **`-DEXIV2_BUILD_DOC=ON`**。 此外,您将需要一个额外的构建步骤来实际构建文档。 ``` $ cmake ..options.. -DEXIV2_BUILD_DOC=ON $ cmake --build build --target doc ``` 要构建文档,您必须安装以下产品: | 产品 | 可用性 | |:------------ |:------------ | | doxygen
graphviz
python
xsltproc
md5sum | [https://www.doxygen.nl/](https://www.doxygen.nl/)
[https://www.graphviz.org/](https://www.graphviz.org/)
[https://www.python.org/](https://www.python.org/)
[http://xmlsoft.org/XSLT/](http://xmlsoft.org/XSLT/)
[http://www.microbrew.org/tools/md5sha1sum/](http://www.microbrew.org/tools/md5sha1sum/) | [TOC](#TOC)
## 构建 Exiv2 标签网页 Exiv2 提供了许多内置元数据标签,这些标签列在 https://exiv2.org/metadata.html 和 https://pre-release.exiv2.org/metadata.html 的子页面中。这些标签网页是使用从 Exiv2 源代码中提取的标签信息生成的。 标签网页构建文件位于 `/doc/templates` 目录中。如果对 Exiv2 源代码中的标签组进行了更改,则需要更新构建文件。对现有标签组中单个标签所做的任何更改都会自动包含在内。 构建标签网页需要构建 Exiv2 示例程序并使用具有额外依赖项的脚本: [BASH](https://www.gnu.org/software/bash/)、[make](https://manpages.org/make)、[xsltproc](https://manpages.org/xsltproc) 和 [Python3](https://www.python.org/)。 要构建标签网页,首先 [从源代码构建 Exiv2](#TOC) 并启用 `-DEXIV2_BUILD_SAMPLES=ON` 选项。这是必需的,因为脚本之一使用了 [taglist](README-SAMPLES.md#taglist) 示例程序。 接下来,设置 `EXIV2_BINDIR` 环境变量(参见 [Exiv2 环境变量](#EnvironmentVariables))。 然后,将目录更改为 `doc/templates` 并运行 `make`。 ``` $ cd /doc/templates $ make ``` 处理后,生成的网页存储在 `/doc/templates` 目录中。 当 Exiv2 网站更新时,生成的标签网页在使用前会重新格式化。 [TOC](#TOC)
## 构建 Exiv2 包 要启用 Exiv2 包的构建,请使用 CMake 选项 `-DEXIV2_TEAM_PACKAGING=ON`。 您不应该构建 Exiv2 包。此功能旨在供 Exiv2 团队在构建服务器上创建平台包和源包。 CMake 命令行中的 cpack 生成两种类型的 Exiv2 包。 1. 平台包(头文件、二进制库和示例。一些文档和发行说明) 为您的平台创建和构建 exiv2。 ``` $ git clone https://github.com/exiv2/exiv2 $ cd exiv2 $ cmake -S . -B build -G "Unix Makefiles" -DEXIV2_TEAM_PACKAGING=ON ... -- Build files have been written to: .../build $ cmake --build build --config Release ... [100%] Built target addmoddel $ cmake --build build --target package ... CPack: - package: /path/to/exiv2/build/exiv2-0.27.1-Linux.tar.gz generated. ``` 2. 源代码包 ``` $ cmake --build build --target package_source Run CPack packaging tool for source... ... CPack: - package: /path/to/exiv2/build/exiv2-0.27.1-Source.tar.gz generated. ``` [TOC](#TOC)
## 调试 Exiv2 1. 生成和安装调试库 通常,要生成调试库,您应该使用 *CMake* 选项 `-DCMAKE_RELEASE_TYPE=Debug` 并以通常的方式构建。 ``` $ cd $ cmake -S . -B build -G "Unix Makefiles" "-DCMAKE_BUILD_TYPE=Debug" $ cmake --build build ``` 您必须安装该库以确保您的代码链接到调试库。 您可以使用以下命令检查是否已生成调试构建: ``` $ exiv2 -vVg debug exiv2 0.27.1 debug=1 $ ``` 2. 关于预处理器符号 `NDEBUG` 和 `EXIV2_DEBUG_MESSAGES` Exiv2 遵守仅为 Release 构建设置的符号 `NDEBUG`。有以下定义的代码序列: ``` #ifdef EXIV2_DEBUG_MESSAGES .... #endif ``` 除非定义了 `EXIV2_DEBUG_MESSAGES`,否则不会编译这些代码块。它们用于提供额外的调试信息。例如,如果您对 webpimage.cpp 的额外输出感兴趣,可以按如下方式更新构建: ``` $ cd $ cmake -S . -B build -DCMAKE_CXX_FLAGS=-DEXIV2_DEBUG_MESSAGES $ cmake --build build $ bin/exiv2 ... -- or -- $ cmake --install build $ exiv2 ... ``` 如果您正在调试库代码,建议使用 exiv2 命令行程序作为测试工具,因为 Exiv2 团队非常熟悉此工具并能够提供支持。 3. 启动调试器 这是特定于平台的。在 Linux 上: ``` $ gdb exiv2 ``` 4. 使用调试器 IDE,如 Xcode、CLion、Visual Studio、Eclipse 或 QtCreator 我使用过所有这些 IDE 来调试 Exiv2 库和应用程序。它们都工作正常。您可能会发现最初需要付出努力,但我向您保证它们都运行良好。 我在 macOS 上工作并使用 Xcode 开发 Exiv2。有两年的时间,Exiv2 团队拥有来自 JetBrains 的免费 开源 CLion 许可证。我非常喜欢 CLion,因为它是跨平台的 并在 Windows、Mac 和 Linux 上运行。它与 CMake 有出色的集成,并将自动 向 CMake 命令添加 **`-DCMAKE_BUILD_TYPE=Debug`**。它将构建类型保留在单独的目录中 ,例如 **`/cmake-build-debug`**。 5. cmake --build build 选项 **`--config Release|Debug`** 和 **`--target install`** Visual Studio 和 Xcode 可以构建调试或发布构建,而无需使用选项 **`-DCMAKE_BUILD_TYPE`**,因为生成的项目文件可以构建多种类型。可以在 CMake 命令行上指定选项 **`--config Debug`** 以指定构建类型。或者,如果您更喜欢在 IDE 中构建,UI 提供选项来选择配置和目标。 使用 Unix Makefile 生成器,可以列出目标: ``` $ cmake --build build --target help The following are some of the valid targets for this Makefile: ... all (the default if no target is provided) ... clean ... depend ... install/local ......... ``` [TOC](#TOC)
## 使用 **clang** 和其他构建链构建 Exiv2 1. 在 Linux 上 ``` $ cd $ rm -rf build $ cmake -S . -B build -DCMAKE_C_COMPILER=$(which clang) -DCMAKE_CXX_COMPILER=$(which clang++) $ cmake --build build ``` **_或者_** ``` $ export CC=$(which clang) $ export CXX=$(which clang++) $ cd $ rm -rf build $ cmake -S . -B build $ cmake --build build ``` 2. 在 macOS 上 Apple 通过 Xcode 提供 clang。自 2013 年以来,Apple 不再支持 GCC。_*“常规 unix 构建”*_ 使用 Clang。 3. 在 Cygwin、MinGW/msys2、Windows(使用 clang-cl)和 Visual Studio 上。 我一直无法让 clang 在任何这些平台上工作。 [TOC](#TOC)
## 使用 ccache 构建 Exiv2 为了加快编译速度,可以安装实用程序 ccache 来缓存编译器的输出。当您经常构建未修改的代码时,这大大加快了构建速度。 安装和使用 ccache(以及其他类似实用程序)取决于平台。在 Ubuntu 上: ``` $ sudo apt install --yes ccache ``` 要使用 ccache 构建,请使用 CMake 选项 **-DBUILD\_WITH\_CCACHE=ON** ``` $ cd $ cmake -S . -B build -G "Unix Makefiles" -DBUILD_WITH_CCACHE=ON $ cmake --build build # 再次构建以体验性能提升 $ cmake --build build --target clean $ cmake --build build ``` 由于 ccache 在 Fedora(和其他 Linux 发行版)中的安装方式,ccache 有效地替换了编译器。默认构建或 **-DBUILD\_WITH\_CCACHE=OFF** 无效,需要环境变量 CCACHE_DISABLE 来禁用 ccache。[https://github.com/Exiv2/exiv2/issues/361](https://github.com/Exiv2/exiv2/issues/361) [TOC](#TOC)
## 线程安全 Exiv2 严重依赖标准 C++ 容器。静态或全局变量仅用于只读,但 XMP 命名空间注册函数(见下文)除外。因此,Exiv2 在与 C++ 容器相同的意义上是线程安全的: 同一类的不同实例可以在多个线程中安全地同时使用。 为了在多个线程中同时使用同一个类实例,应用程序必须序列化对对象的所有写访问。 Exiv2 内的线程安全级别因元数据的类型而异:Exif 和 IPTC 代码是可重入的。XMP 代码使用 Adobe XMP 工具包 (XMP SDK),根据其文档,它是线程安全的。它实际上使用互斥锁来序列化关键部分。但是,XMP SDK 初始化函数没有互斥锁保护,因此 Exiv2::XmpParser::initialize 不是线程安全的。此外,Exiv2::XmpProperties::registerNs 写入静态类变量,也不是线程安全的。 因此,多线程应用程序需要确保这两个 XMP 函数被序列化,例如,通过在启动任何线程之前运行的初始化部分调用它们。所有 exiv2 示例应用程序都以以下内容开头: ``` #include int main(int argc, const char* argv[]) { Exiv2::XmpParser::initialize(); ::atexit(Exiv2::XmpParser::terminate); ... } ``` [TOC](#TOC)
## 库初始化和清理 正如关于线程安全的部分所讨论的,用于 Exif 和 IPTC 元数据的 Exiv2 类是完全可重入的,不需要初始化或清理。 Adobe 的 XMPsdk 通常是线程安全的,但是必须在启动任何线程访问 XMP 元数据之前和之后对其进行初始化和终止。Exiv2 库将在必要时对其进行初始化,但它不会终止 XMPsdk。 exiv2 命令行程序和示例应用程序在开始时调用以下内容: ``` Exiv2::XmpParser::initialize(); ::atexit(Exiv2::XmpParser::terminate); ``` [TOC](#TOC)
## 在 Linux 上为 MinGW 进行跨平台构建和测试 您可以在 Linux 上为 MinGW 交叉编译 Exiv2。我们在 **Fedora** 上使用了以下方法,并认为这在 Ubuntu 和其他发行版上也是可能的。此处提供了 **Fedora** 的详细说明。 ### 在 Fedora 上进行交叉构建和测试 #### 1 安装跨平台构建工具 ``` $ sudo dnf install mingw64-gcc-c++ mingw64-filesystem mingw64-expat mingw64-zlib cmake make ``` #### 2 安装依赖项 您需要安装 x86_64 以支持您希望使用的选项。默认情况下,您需要 libz 和 expat。您上面的 `dnf` 命令已经为您安装了它们。如果您希望使用诸如 `webready` 之类的功能,您应该安装 openssl 和 libcurl,如下所示: ``` [rmills@rmillsmm-fedora 0.27-maintenance]$ sudo yum install libcurl.x86_64 openssl.x86_64 Last metadata expiration check: 0:00:18 ago on Fri 10 Apr 2020 10:50:30 AM BST. Dependencies resolved. ========================= Package Architecture Version Repository Size ========================= Installing: ... ``` #### 3 获取代码并构建 ``` $ git clone://github.com/exiv2/exiv2 --branch 0.27-maintenance exiv2 $ cd exiv2 $ mkdir build_mingw_fedora $ mingw64-cmake .. $ make ``` 注意,您可能希望选择使用可选功能构建和/或构建静态库。为此,请在 mingw64-cmake 命令上适当地请求: ``` $ mingw64-cmake .. -DEXIV2_TEAM_EXTRA_WARNINGS=ON \ -DEXIV2_ENABLE_WEBREADY=ON \ -DBUILD_SHARED_LIBS=OFF ``` 交叉编译可用的选项与所有构建提供的选项相同。参见:[构建选项](#BuildOptions) #### 4 将“系统 dll”复制到 bin 目录中 需要这些 DLL 才能从 Windows 在 bin 中执行跨平台构建 ``` for i in libexpat-1.dll libgcc_s_seh-1.dll libstdc++-6.dll libwinpthread-1.dll zlib1.dll ; do cp -v /usr/x86_64-w64-mingw32/sys-root/mingw/bin/$i bin done ``` #### 5 在 wine 中执行 exiv2 您可能希望使用 wine 从命令提示符执行 exiv2。为此: ``` [rmills@rmillsmm-fedora build_mingw_fedora]$ wine cmd Microsoft Windows 6.1.7601 Z:\Home\gnu\github\exiv2\main\build_mingw_fedora>bin\exiv2 exiv2: An action must be specified exiv2: At least one file is required Usage: exiv2 [ option [ arg ] ]+ [ action ] file ... Image metadata manipulation tool. ``` 如果您尚未安装 wine,Fedora 将为您提供安装它。 #### 6 运行测试套件 在默认的 wine 安装上,您处于 MSDOS/cmd.exe 提示符下。您无法在此环境中执行 exiv2 测试套件,因为您需要 python3 和 MSYS/bash 来运行该套件。 您应该将您的 Fedora exiv2/ 目录挂载在已安装 MinGW/msys2 的 Windows 机器上。您需要 python3 和 make。 我的构建机器是一台 MacMini,带有用于 Windows、Fedora 和其他平台的 VM。在 Fedora 上,我在一个共享给所有 VM 的 Mac 目录中构建。 ``` [rmills@rmillsmm-fedora 0.27-maintenance]$ pwd /media/psf/Home/gnu/github/exiv2/0.27-maintenance [rmills@rmillsmm-fedora 0.27-maintenance]$ ls -l build_mingw_fedora/bin/exiv2.exe -rwxrwxr-x. 1 rmills rmills 754944 Apr 10 07:44 build_mingw_fedora/bin/exiv2.exe [rmills@rmillsmm-fedora 0.27-maintenance]$ ``` 在 MinGW/msys2 上,我可以直接访问共享: ``` $ cd //Mac/Home/gnu/github/exiv2/0.27/maintenance/build_mingw_fedora $ mingw64-ctest ``` 您会发现测试套件结束时 3 个测试失败。忽略这些小异常是安全的。 [TOC](#TOC)
## 静态和共享库 您可以构建静态或共享库。两者都可以与静态或共享运行时库链接。您使用选项 `-BUILD_SHARED_LIBS=ON|OFF` 指定共享/静态。您使用选项 `-DEXIV2_ENABLE_DYNAMIC_RUNTIME=ON|OFF` 指定运行时。两个选项的默认值均为 ON。因此您构建共享并使用共享库,在 Windows (msvc、Cygwin 和 MinGW/msys) 上是 `.dll`,在 macOS 上是 `.dylib`,在 Linux 和 UNIX 上是 `.so`。 CMake 在目录 `bin` 和 `lib` 中创建您的构建产物。`bin` 目录包含您的可执行文件和 .DLL。`lib` 目录包含您的静态库。当您安装 exiv2 时,构建产物将复制到系统的前缀目录,默认为 `/usr/local/`。如果您希望在不安装的情况下测试和使用您的构建,您必须适当地设置您的 PATH。Linux/Unix 用户还应设置 `LD_LIBRARY_PATH`,macOS 用户应设置 `DYLD_LIBRARY_PATH`。 默认构建是 SHARED/DYNAMIC,这种安排以统一的方式处理所有可执行文件和共享库。 **注意:** _以下讨论仅适用于您链接到 exiv2 库的静态版本的情况。_ 您可能会从 CMake 收到以下错误: ``` CMake Error at src/CMakeLists.txt:30 (add_library): Target "my-app-or-library" links to target "Iconv::Iconv" but the target was not found. Perhaps a find_package() call is missing for an IMPORTED target, or an ALIAS target is missing? ``` 请注意,有关 `src/CMakeLists.txt:30 (add_library)` 的警告是指您的文件 src/CMakeLists.txt。尽管 exiv2 已静态链接 `Iconv()`,您的代码也需要链接。您可以通过以下代码在 src/CMakeLists.txt 中实现这一点: ``` find_package(Iconv) if( ICONV_FOUND ) target_link_libraries( my-app-or-library PRIVATE Iconv::Iconv ) endif() ``` 这在此处讨论:[https://github.com/Exiv2/exiv2/issues/1230](https://github.com/Exiv2/exiv2/issues/1230) [TOC](#TOC)
## 对 BMFF 文件的支持(例如 CR3, HEIF, HEIC, AVIF 和 JPEG XL) **请注意,BMFF 支持可能受专利权的约束。_Exiv2 不对识别任何或所有此类专利权负责。Exiv2 不对使用本代码的法律后果负责_。** 对 BMFF 代码的访问由 CMake 选项保护:`-DEXIV2_ENABLE_BMFF=ON`(默认启用)。 [TOC](#TOC)
# 许可证和支持 所有项目资源均可从项目网站访问。 https://github.com/Exiv2/exiv2
## 许可证 版权所有 (C) 2004-2026 Exiv2 作者。 您应该收到一份文件 [COPYING](COPYING) 的副本,其中详细说明了 GPLv2 许可证。 Exiv2 是自由软件;您可以根据自由软件基金会发布的 GNU 通用公共许可证的条款重新分发和/或修改它;许可证的第 2 版,或(根据您的选择)任何后续版本。 分发 Exiv2 程序是希望它会有用,但不提供任何保证;甚至没有适销性或特定用途适用性的暗示保证。有关更多详细信息,请参阅 GNU 通用公共许可证。 您应该收到一份 GNU 通用公共许可证的副本以及该程序;如果没有,请写信给 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA。 [TOC](#TOC)
## 支持 对于新的错误报告、功能请求和支持:请在 Github 中打开一个问题。[https://github.com/exiv2/exiv2](https://github.com/exiv2/exiv2) [TOC](#TOC)
# 测试套件 您使用 CTest 执行测试套件,命令为 `$ ctest --test-dir build`。 构建创建了 6 个测试:bashTests、bugfixTests、lensTests、tiffTests、unitTests 和 versionTests。您可以运行所有测试或一个子集。要列出所有可用的测试,请使用 `-N` 或 `--show-only` 选项执行 ctest,该选项禁用执行: ``` .../exiv2 $ ctest --test-dir build --show-only Test project .../exiv2/build Test #1: bashTests Test #2: bugfixTests Test #3: lensTests Test #4: tiffTests Test #5: versionTests Test #6: unitTests Total Tests: 6 .../exiv2 $ ``` ctest 提供许多选项,以下显示了常见的用例场景: ``` $ ctest --test-dir build # run all tests and display summary $ ctest --test-dir build --output-on-failure # run all tests and output failures $ ctest --test-dir build -R bugfix # run only bugfixTests and display summary $ ctest --test-dir build -R bugfix --verbose # run only bugfixTests and display all output ``` 除了 `unitTests`,CMake 需要在系统中找到 python3 解释器才能使用 CTest 运行其余的测试目标: | 名称 | 语言 | 位置 | 命令
_(在构建目录中)_ | 用于构建的 CMake 选项 | |:-- |:-- |:-- |:-- |:-- | | bashTests | python | tests/bash_tests | $ ctest -R bash | -DEXIV2_BUILD_SAMPLES=ON | | bugfixTests | python | tests/bugfixes | $ ctest -R bugfix | -DEXIV2_ENBALE_VIDEO=ON | | lensTest | C++ | tests/lens_tests | $ ctest -R lens | | | tiffTests | python | tests/tiff_test | $ ctest -R tiff | | | unitTests | C++ | unitTests/ | $ ctest -R unit | -DEXIV2_BUILD_UNIT_TESTS=ON | | versionTests | C++ | src/version.cpp | $ ctest -R version | 总是在库中 | 术语 _**bashTests**_ 是历史性的。这些测试最初是 bash 脚本,已用 python 重写。 Visual Studio 用户会欣赏 python 实现,因为它避免了 mingw/cygwin 的安装和特殊的 PATH 设置。 如果您在目录 `/build` 中构建代码,测试将使用环境变量的默认值运行。 [TOC](#TOC)
## Exiv2 环境变量 Exiv2 在构建或测试时可选地使用几个不同的环境变量。 | 变量 | 默认值 | 平台 | 用途 | |:-- |:-- |:-- |:-- | | EXIV2_BINDIR | **\/build/bin** | 所有平台 | 构建的二进制文件(例如 exiv2.exe)的路径 | | EXIV2_PORT | **12762**
**12671**
**12760** | Cygwin
MinGW/msys2
其他平台 | 测试 TCP/IP 端口 | | EXIV2_HTTP | **http://localhost** | 所有平台 | 测试 http 服务器 | | EXIV2_ECHO | _**未设置**_ | 所有平台 | 用于调试 bashTests | | VALGRIND | _**未设置**_ | 所有平台 | 用于调试 bashTests | | VERBOSE | _**未设置**_ | Makefile 平台 | 指示 make 报告其操作 | | PATH
DYLD\_LIBRARY\_PATH
LD\_LIBRARY\_PATH | $EXIV2\_BINDIR/../lib | Windows
macOS
其他平台 | 动态库的路径 | 可以将变量 EXIV2\_PORT 或 EXIV2\_HTTP 设置为 None 以跳过 http 测试。http 服务器使用命令 `python3 -m http.server $port` 启动。在 Windows 上,您需要手动运行此命令 _**一次**_,以授权防火墙允许 python 使用该端口。 [TOC](#TOC)
## 在类 Unix 系统上运行测试 您可以直接从构建中运行测试: ``` $ cmake -S . -B build -G "Unix Makefiles" -DEXIV2_BUILD_UNIT_TESTS=ON ... lots of output and build summary ... $ cmake --build build ... lots of output ... $ ctest --test-dir build ... test summary ... $ ``` 您可以在 `test` 目录中运行单独的测试。**注意:** 如果您在除 \/build 之外的目录中构建,则必须设置 EXIV2\_BINDIR 才能从 `test` 目录运行测试。 ``` $ cd $ ctest --test-dir build -R bash --verbose addmoddel_test (testcases.TestCases) ... ok .... Ran 176 tests in 9.526s OK (skipped=6) $ ctest --test-dir build -R bugfix --verbose ... lots of output ... test_run (tiff_test.test_tiff_test_program.TestTiffTestProg) ... ok ---------------------------------------------------------------------- Ran 176 tests in 9.526s OK (skipped=6) $ ``` [TOC](#TOC)
## 从 cmd.exe 在 Visual Studio 构建版本上运行测试 **注意:** _python3 解释器必须在 PATH 上,为 DOS 构建,并名为 python3.exe。_ 我复制了 python.exe 程序: ``` > copy c:\Python37\python.exe c:\Python37\python3.exe > set PATH=c:\Python37;%PATH% ``` 您可以以类似于类 UNIX 系统描述的方式执行测试套件。您 _**必须**_ 为 Visual Studio 构建向 ctest 提供 `-C` 配置选项。 ``` > cd > ctest --test-dir build -C Release > ctest --test-dir build -C Release -R bugfix --verbose ``` Visual Studio 可以构建不同的配置,如下所示: ``` > cmake --build build --config Release # or Debug or MinSizeRel or RelWithDebInfo > ctest --test-dir build -C Release ``` **CMake** 配置选项 `--config` 的默认值为 `Release`。**ctest** 没有配置选项 `-C` 的默认值。 ### 从 cmd.exe 运行测试 您可以使用 Conan 通过 Visual Studio 构建。这在 [README-CONAN.md](README-CONAN.md) 中有详细描述 作为总结,过程如下: ``` c:\...\exiv2>conan install . --build missing --profile msvc2019Release c:\...\exiv2>cmake -S . B build -DEXIV2_BUILD_UNIT_TESTS=ON -G "Visual Studio 16 2019" c:\...\exiv2>cmake --build build --config Release ... lots of output from compiler and linker ... c:\...\exiv2>ctest --test-dir build -C Release ``` 如果您希望使用环境变量,请使用 set: ``` set EXIV2_PORT=54321 ctest --test-dir build -C Release --verbose -R bash set EXIV2_PORT= ``` [TOC](#TOC)
## 单元测试 单元测试的代码位于 `/unitTests`。要在构建中包含单元测试,请使用 *CMake* 选项 `-DEXIV2_BUILD_UNIT_TESTS=ON`。 网上有一个关于安装 GTest 的讨论:[https://github.com/Exiv2/exiv2/issues/575](https://github.com/Exiv2/exiv2/issues/575) ``` $ pushd /tmp $ curl -LO https://github.com/google/googletest/archive/release-1.8.0.tar.gz $ tar xzf release-1.8.0.tar.gz $ mkdir -p googletest-release-1.8.0/build $ pushd googletest-release-1.8.0/build $ cmake .. ; make ; make install $ popd $ popd ``` [TOC](#TOC)
## 错误修复测试 您可以从构建目录运行错误修复测试: ``` $ cd $ ctest --test-dir build -R bugfix ``` 如果您希望在详细模式下运行: ``` $ cd $ ctest --test-dir build -R bugfix --verbose ``` 错误修复测试存储在目录 tests/ 中,您可以使用以下命令运行所有测试: ``` $ cd /tests $ export LD_LIBRARY_PATH="$PWD/../build/lib:$LD_LIBRARY_PATH" $ python3 runner.py ``` 您可以使用如下命令单独运行它们: ``` $ cd /tests $ python3 runner.py --verbose bugfixes/redmine/test_issue_841.py # or $(find . -name "*841*.py") ``` 您可能希望使用如下命令获取失败的简要摘要: ``` $ cd $ ctest --test-dir build -R bugfix --verbose 2>&1 | grep FAIL ``` [TOC](#TOC)
## 模糊测试 (Fuzzing) 模糊测试工具的代码位于 `exiv2dir/fuzz` 要构建模糊测试工具,请使用 *cmake* 选项 `-DEXIV2_BUILD_FUZZ_TESTS=ON` 和 `-DEXIV2_TEAM_USE_SANITIZERS=ON`。 请注意,它仅适用于 clang 编译器,因为 libFuzzer 集成在 clang > 6.0 中 要构建模糊测试工具: ``` $ cd $ rm -rf build-fuzz $ cmake -S . -B build-fuzz -DCMAKE_CXX_COMPILER=$(which clang++) -DEXIV2_BUILD_FUZZ_TESTS=ON -DEXIV2_TEAM_USE_SANITIZERS=ON $ cmake --build build-fuzz ``` 要执行模糊测试工具: ``` cd /build-fuzz mkdir corpus ./bin/fuzz-read-print-write corpus ../test/data/ -jobs=$(nproc) -workers=$(nproc) -max_len=4096 ``` 有关模糊测试的更多信息,请参阅 [`fuzz/README.md`](fuzz/README.md)。 [TOC](#TOC)
### OSS-Fuzz Exiv2 已加入 [OSS-Fuzz](https://google.github.io/oss-fuzz/),这是由 Google 运行的开源项目模糊测试服务。 OSS-Fuzz 用于构建 Exiv2 的构建脚本可以在 [这里](https://github.com/google/oss-fuzz/tree/master/projects/exiv2/build.sh) 找到。它使用与上述相同的模糊测试目标 ([`fuzz-read-print-write`](fuzz/fuzz-read-print-write.cpp)),但构建配置略有不同,以便与 OSS-Fuzz 集成。特别是,它使用 CMake 选项 `-DEXIV2_TEAM_OSS_FUZZ=ON`,该选项构建模糊测试目标而不添加 `-fsanitize=fuzzer` 标志,以便 OSS-Fuzz 可以自行控制 sanitizer 标志。 [TOC](#TOC)
# 平台说明 设置和配置您的平台有多种方法。提供以下说明作为指南。
## Linux 您的系统并安装构建工具和依赖项(zlib、expat、gtest 等) ``` $ sudo apt --yes update $ sudo apt install --yes build-essential ccache clang cmake git google-mock libbrotli-dev libcurl4-openssl-dev libexpat1-dev libgtest-dev libinih-dev libssh-dev libxml2-utils libz-dev python3 zlib1g-dev ``` 对于其他平台的用户,脚本 /ci/install_dependencies.sh 包含用于配置许多平台的代码。该文件中的代码是配置您的平台的有用指南。 从 GitHub 获取代码并构建 ``` $ mkdir -p ~/gnu/github/exiv2 $ cd ~/gnu/github/exiv2 $ git clone https://github.com/exiv2/exiv2 $ cd exiv2 $ cmake -S . -B build -G "Unix Makefiles" $ cmake --build build ``` [TOC](#TOC)
## macOS 您需要安装 Xcode 和 Xcode 命令行工具才能在 macOS 上构建。 您应该构建并安装 libexpat 和 zlib。您可以使用 brew、macports、从源代码构建或使用 conan。 我建议您从源代码构建并安装 CMake。 [TOC](#TOC)
## MinGW/msys2 请注意,32 位 MinGW 平台已过时并被 64 位 MSYS2 发行版取代。重要的是要强调我们依赖于使用通用 C 运行时 (UCRT) 及其相对较新的 UTF-8 支持。查看此 [PR](https://github.com/Exiv2/exiv2/pull/2090) 以获取更多信息。因此,您需要使用 [MSYS2 URCT64 环境](https://www.msys2.org/docs/environments/)。 安装最新版本的 [MSYS2](https://repo.msys2.org/distrib/msys2-x86_64-latest.exe),并按照 [此处](https://www.msys2.org/) 提供的安装说明进行操作。 CI 工作流文件 `.github/workflows/on_PR_windows_matrix.yml` 有一个名为 `msys2` 的构建作业,其中的说明展示了如何在 MSYS2 上配置 Exiv2。 ### 安装 exiv2 依赖项 请注意,您需要安装 exiv2 依赖项的 `ucrt-x86_64` 包版本: ``` pacman -S --needed mingw-w64-ucrt-x86_64-{brotli,cc,cmake,curl,expat,gettext,gtest,libiconv,libwinpthread,ninja,zlib} ``` ### 从 github 下载 exiv2 并构建 使用 Windows 开始菜单打开为 UCRT64 环境定制的终端:`MSYS2 MinGW UCRT x64`。然后运行以下命令以下载 exiv2、配置项目并构建它: ``` mkdir -p ~/gnu/github/exiv2 cd ~/gnu/github/exiv2 git clone https://github.com/exiv2/exiv2 cd exiv2 cmake -S . -B build -G Ninja -DCMAKE_CXX_FLAGS=-Wno-deprecated -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -DEXIV2_BUILD_SAMPLES=ON -DEXIV2_ENABLE_NLS=OFF -DEXIV2_ENABLE_WEBREADY=ON -DEXIV2_ENABLE_BMFF=ON -DEXIV2_BUILD_UNIT_TESTS=ON cmake --build build ``` 此时生成的二进制文件可以从 MSYS2 UCRT64 终端执行,但它们不会从 Windows 命令提示符或 PowerShell 运行。原因是 MSYS2 UCRT64 终端已正确配置为查找某些所需的 DLL。如果您希望能够从任何 Windows 终端运行生成的 **exiv2** 二进制文件,则需要随应用程序部署所需的 DLL。 [TOC](#TOC)
## Cygwin/64 请注意,Cygwin/32 平台已过时并被 Cygwin/64 取代。 下载:[https://cygwin.com/install.html](https://cygwin.com/install.html) 并运行 setup-x86_64.exe。我安装到 c:\\cygwin64 您需要: make, cmake, curl, gcc, gettext-devel pkg-config, dos2unix, tar, zlib-devel, libexpat1-devel, git, libxml2-devel python3-interpreter, libiconv, libxml2-utils, libncurses, libxml2-devel libxslt-devel python38 python38-pip python38-libxml2 CI 工作流文件 `.github/workflows/on_PR_windows_matrix.yml` 有一个名为 `cygwin` 的构建作业,其中的说明展示了如何在 Cygwin/64 上配置 Exiv2。 要构建单元测试,您应该安装 googletest-release-1.8.0,如 [单元测试](#UnitTests) 中所述 我使用以下批处理文件“cygwin64.bat”从 Dos 命令提示符 启动 Cygwin/64 bash shell。 ``` @echo off setlocal set "PATH=c:\cygwin64\usr\local\bin;c:\cygwin64\bin;c:\cygwin64\usr\bin;c:\cygwin64\usr\sbin;" if NOT EXIST %HOME% mkdir %HOME% set "HOME=c:\cygwin64\home\rmills" cd %HOME% set "PS1=\! CYGWIN64:\u@\h:\w \$ " bash.exe -norc endlocal ``` [TOC](#TOC)
## Visual Studio 我们建议您在使用 Visual Studio 时使用 Conan 获取 Exiv2 依赖项。Exiv2 v0.27 可以使用 Visual Studio 2008 及更高版本构建。对于 `main` 分支,我们积极支持并使用 Visual Studio 2019 和 2022 构建。 除了 Visual Studio,您还需要安装 CMake、Python3 和 Conan。 1. Windows 上的 CMake 二进制安装程序可从 [https://cmake.org/download/](https://cmake.org/download/) 获取。
2. Python3 二进制安装程序可从 [python.org](https://python.org) 获取
3. Conan 可以使用 python/pip 安装。详细信息在 [README-CONAN.md](README-CONAN.md) 中 ``` ..>copy c:\Python37\python.exe c:\Python37\python3.exe ``` python3 解释器必须在您的 PATH 上。 重要的是要强调我们依赖于使用通用 C 运行时 (UCRT) 及其相对较新的 UTF-8 支持。查看此 [PR](https://github.com/Exiv2/exiv2/pull/2090) 以获取更多信息。 [TOC](#TOC)
## Unix Exiv2 可以在许多 Unix 和 Linux 发行版上构建。在 v0.27.2 中,我们要开始积极支持 Unix 发行版 NetBSD 和 FreeBSD。对于 v0.27.3,我添加了对 Solaris 11.4 的支持 我们在 GitHub 上没有针对这些平台的 CI 支持。但是,我经常在我的 MacMini Buildserver 上构建和测试它们。该设备是私有的,不在互联网上。 我根据我在这些平台上的经验在这里提供了说明。欢迎反馈。如果您提供您的平台的 ssh 帐户,我愿意在其他商业 Unix 发行版(如 AIX、HP-UX 和 OSF/1)上支持 Exiv2。我将需要超级用户权限来安装软件。 对于所有平台,您将需要以下组件来构建: 1. gcc 或 clang 2. cmake 3. bash 4. sudo 5. gettext 要运行测试套件,您需要: 1. python3 2. chksum 3. dos2unix 4. xmllint ### NetBSD 您可以使用为 linux 描述的方法从源代码构建 exiv2。我使用“Pure CMake”构建并安装了 exiv2,并且不需要 conan。 您将需要使用包管理器 `pkgsrc` 来构建/安装上面列出的构建和测试组件。 我在文件系统中输入了链接 ``` # ln -s /usr/pkg/bin/python37 /usr/local/bin/python3 # ln -s /usr/pkg/bin/bash /bin/bash` ``` 确保 `LD_LIBRARY_PATH` 包含 `/usr/local/lib` 和 `/usr/pkg/lib` 非常重要。 确保 `PATH` 包含 `/usr/local/bin`、`/usr/pkg/bin` 和 `/usr/pkg/sbin` 非常重要。 ### FreeBSD Clang 作为 ``/usr/bin/{cc|c++}`` 以及 libz 和 expat 预安装。FreeBSD 使用 pkg 作为包管理器,我用它来安装 CMake 和 git。 ``` $ su root Password: # pkg install cmake # pkg install git # pkg install bash # pkg install python ``` **注意**:_包管理器 *pkg* 在 FreeBSD 12.0 上不再工作。我将迁移到 12.1 以进行未来的工作。其他人报告了 12.1 上的此问题。损坏的包管理器是非常糟糕的消息。还有其他包管理器(如 ports),但是安装并使其工作是艰巨的。_ ``` 634 rmills@rmillsmm-freebsd:~/gnu/github/exiv2/0.27-maintenance/build $ sudo pkg install libxml2 Updating FreeBSD repository catalogue... pkg: repository meta /var/db/pkg/FreeBSD.meta has wrong version 2 pkg: Repository FreeBSD load error: meta cannot be loaded No error: 0 Fetching meta.txz: 100% 916 B 0.9kB/s 00:01 pkg: repository meta /var/db/pkg/FreeBSD.meta has wrong version 2 repository FreeBSD has no meta file, using default settings Fetching packagesite.txz: 100% 6 MiB 340.2kB/s 00:19 pkg: repository meta /var/db/pkg/FreeBSD.meta has wrong version 2 pkg: Repository FreeBSD load error: meta cannot be loaded No error: 0 Unable to open created repository FreeBSD Unable to update repository FreeBSD Error updating repositories! 635 rmills@rmillsmm-freebsd:~/gnu/github/exiv2/0.27-maintenance/build $ ``` ### Solaris Solaris 使用包管理器 pkg。要获取包列表: ``` $ pkg list ``` 要安装包: ``` $ sudo pkg install developer/gcc-7 ``` [TOC](#TOC) 更新日期:2026-02-24
标签:Bash脚本, C++, EXIF, Exiv2, IPTC, IP 地址批量处理, XMP, 元数据管理, 图像处理, 图像格式, 地理标记, 多媒体, 开发组件, 开源库, 搜索引擎爬虫, 数字资产, 数据擦除, 文件解析, 文档安全, 照片管理, 逆向工具, 配置审计