Exiv2/exiv2
GitHub: Exiv2/exiv2
Exiv2 是一个跨平台的 C++ 图像元数据操作库及命令行工具,专注于读写和修改 Exif、IPTC、XMP 和 ICC 等多种格式的图像元数据。
Stars: 1107 | Forks: 314
| Codecov | OSS-Fuzz | Repology | 聊天 |
| :----------------------------------------------------------: | :----------------------------------------------------------: | :----------------------------------------------------------: | :----------------------------------------------------------: |
| [](https://codecov.io/gh/Exiv2/exiv2) | [](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:exiv2) | [](https://repology.org/metapackage/exiv2/versions) | [](https://matrix.to/#/#exiv2-chat:matrix.org) |
| **CI 状态:** | | | |
|:-- |:-- |:-- |:-- |
| [](https://github.com/Exiv2/exiv2/actions/workflows/release.yml) | [](https://github.com/Exiv2/exiv2/actions/workflows/on_push_BasicWinLinMac.yml) | [](https://github.com/Exiv2/exiv2/actions/workflows/nightly_Linux_distributions.yml) | [](https://github.com/Exiv2/exiv2/actions/workflows/on_push_ExtraJobsForMain.yml) |
# 欢迎使用 Exiv2

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 还记录了如何在平台上编译和链接代码。
预发布版本:
项目资源
许可证 (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)
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)
使用 _**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)
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)