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.pc
,libxml++-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; }
我是一名 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.pc
,libxml++-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; }