C++/CMake 找不到 libxml++

C++/CMake can't find libxml++

我是一名 Java/Go/Python 开发人员,试图尝试使用 C++ 工具链,并且很难强迫 CMake 找到依赖项。我使用 apt-get install libxml++2.6-dev 在 Debian 上安装了 libxml++,并将其安装到 /usr/include/libxml++2.6/libxml++。这是一个问题,因为那不是相对于 /usr/include 的正确路径——如果我尝试 #include <libxml++/libxml++.h> 它显然找不到它,并且如果我包含一些东西,例如#include <libxml++2.6/libxml++/whatever.h> 那么 whatever.h 将无法找到搜索 libxml++ 路径的其他头文件,例如#include <libxml++/version.h>。库附带了 pkg-config 文件,但我真的不知道如何处理它们,并且使用 find_package(LibXml++)include_directories(${LibXml++_INCLUDE_DIRS}) 之类的东西没有用。

查看 CMake 文档,似乎有几种方法可以解决每个简单的问题,如果这与 apt-get 安装方式有关,我觉得这一定是一个非常简单的问题和一个简单的解决方案事物。有没有我可以添加的东西来强制 CMake 在 /usr/include/[something]/libxml++ 中专门查找并仍然使用相对路径正确导入它,或者我是否需要在每次使用 apt 安装它时移动东西?

抱歉,如果这是重复的,但是“libxml++”是一个非常难以 Google 的库,这既是因为“++”标点符号,也是因为它显然没有在任何地方使用常规 libxml2.我很高兴阅读更多基本资源,但不想通过 C++ 30 年的演变来得出答案。

供参考:

CMakeLists.txt:

cmake_minimum_required(VERSION 3.10)
project(sandbox)

set(CMAKE_CXX_STANDARD 17)

find_package(Boost REQUIRED)
find_package(LibXml2 REQUIRED)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/ ${LIBXML2_INCLUDE_DIR})
add_executable(sandbox main.cpp)
target_link_libraries(sandbox ${LIBXML2_LIBRARIES})

源文件:

#include <iostream>
#include <libxml++2.6/libxml++/libxml++.h>

int main() {
    std::cout << "hello" << std::endl;
}

错误消息:

[main] Building folder: cpp-sandbox 
[build] Starting build
[proc] Executing command: /usr/bin/cmake --build /workspaces/cpp-sandbox/build --config Debug --target all -- -j 6
[build] Scanning dependencies of target sandbox
[build] [ 50%] Building CXX object CMakeFiles/sandbox.dir/main.cpp.o
[build] In file included from /workspaces/cpp-sandbox/main.cpp:2:
[build] /usr/include/libxml++-2.6/libxml++/libxml++.h:50:10: fatal error: libxml++/exceptions/internal_error.h: No such file or directory
[build]  #include <libxml++/exceptions/internal_error.h>
[build]           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[build] compilation terminated.
[build] make[2]: *** [CMakeFiles/sandbox.dir/build.make:63: CMakeFiles/sandbox.dir/main.cpp.o] Error 1
[build] make[1]: *** [CMakeFiles/Makefile2:73: CMakeFiles/sandbox.dir/all] Error 2
[build] make: *** [Makefile:84: all] Error 2
[build] Build finished with exit code 2

您可能应该将此行添加到您的 CMakeLists.txt :

include_directories("/usr/include/libxml++2.6/")

(或使用任何宏来实现此结果)

然后在你的主要 :

#include <iostream>
#include <libxml++/libxml++.h> // <= like this

int main() {
    std::cout << "hello" << std::endl;
}

另一种方法:

如果它不能解决您的问题,您也可以尝试转到 libxml++ 页面:https://developer.gnome.org/libxml++-tutorial/stable/chapter-introduction.html .

这里有一个link可以下载libxml++。

然后你只需要按照文件调用INSTALL中的说明,并添加包含目录:

include_directories("<your-path/libxml++2.6>")

并在您的编译器使用

搜索库时为您的编译器添加一个新的库路径
link_directories("<your-other-path>/lib")

希望对你有帮助

LibXml2 和 LibXml2++ 是 不同的 库,因此 find_package() 其中一个 - LibXml2 - 对另一个库没有帮助。

CMake 未附带 LibXml2++ 的“查找”脚本,但由于您有库的 .pc 文件,使用它非常简单:

# Search pkg-config utility first
find_package(PkgConfig REQUIRED)
# Then use pkg-config for locate specific package
pkg_check_modules(LIBXMLXX REQUIRED IMPORTED_TARGET libxml++-2.6)

add_executable(sandbox main.cpp)

# Link with the IMPORTED target created by 'pkg_check_modules'
# That target contains both include directories and actual libraries for link.
target_link_libraries(sandbox PkgConfig::LIBXMLXX)

请注意,pkg_check_modules 调用 (LIBXMLXX) 的第一个参数仅表示您要创建的导入目标的名称。您可以根据需要指定任何名称。

但是 pkg_check_modules 调用 (libxml++-2.6) 的最后一个参数是包的名称,它应该与 .pc 文件的基本名称完全匹配。由于 you have 文件 libxml++-2.6.pclibxml++-2.6 应该用作 pkg_check_modules.

的最后一个参数

有关 pkg-config 与 CMake 一起使用的更多详细信息,请参阅

我通过合并两个答案设法解决了明显相同的问题(在 Ubuntu 20.04 和 g++9 上)。一些版本更改可能适用

cmake_minimum_required (VERSION 3.10)
project (sandbox)
find_package (LibXml2 REQUIRED)
find_package (PkgConfig REQUIRED)
pkg_check_modules (LIBXMLXX REQUIRED IMPORTED_TARGET libxml++-2.6)
include_directories (${LIBXML2_INCLUDE_DIR})
include_directories ("/usr/include/libxml++2.6/")
add_executable (sandbox main.cpp)
target_link_libraries (sandbox ${LIBXML2_LIBRARIES} PkgConfig::LIBXMLXX)

并与main.cpp来源

#include <libxml++/libxml++.h>
int main() { return 0; }