需要示例 CMake 项目,该项目在 Windows 和 Visual Studio 上使用 Xerces-C++ 3

Need sample CMake project that uses Xerces-C++ 3 on Windows with Visual Studio

本文关键字:项目 Visual Studio Xerces-C++ CMake Windows      更新时间:2023-10-16

我正在尝试在Windows 10上使用xerces-c-3.2.2.2,来自xerces-c-3.2.2\samples\src\SAXPrint中的示例,该示例用作Visual Studio 2019项目。

之前,我成功地将xerces-c_2_8_0与xerces-c-src_2_8_0\samples\SAX2Print一起使用为具有Visual Studio配置(不是CMake(的Visual Studio 2019项目。当尝试使用 xerces-c-3.2.2 和相应的示例时,我得到"错误MSB6006:"CL.exe"以代码 2 退出"。

注意:我自己构建了 xerces-c-3.2.2,因为它没有可用的二进制文件。在构建 xerces-c-3.2.2 之后,我在 C:\Xerces\xerces-c-3.2.2\src\Release 中获得了文件 xerces-c_3.exp、xerces-c_3.lib 和 xerces-c_3_2.dll,包含文件位于 C:\Xerces\xerces-c-3.2.2\xerces-c-3.2.2\src 中。

在 https://developercommunity.visualstudio.com/content/problem/405001/error-msb6006-clexe-exited-with-code-2.html,建议使用Clang作为编译器,因为提到的"MSB6006"错误应该是Microsoft尚未修复的编译器错误。要使用Clang,必须在当前版本的Visual Studio中使用CMake(出于其他原因,无论如何我更喜欢CMake(,并且我无法弄清楚如何使用CMake正确设置项目。问题是如何告诉 CMake 关于 Xerces库文件的信息(使用 xerces-c-3.2.2,似乎只有一个库文件 xerces-c_3.lib(。

所以我的顶级CMakeLists.txt(没有链接(是:

cmake_minimum_required (VERSION 3.8)
project ("SAXPrint")
include_directories("C:\Xerces\xerces-c-3.2.2\xerces-c-3.2.2\src")
add_subdirectory ("SAXPrint")

子目录中的 CMakeLists.txt 是

cmake_minimum_required (VERSION 3.8)
add_executable(SAXPrint "SAXPrint.cpp" "SAXPrint.hpp")

(是的,我知道我应该使用绝对路径作为 CMake 的参数,但这不应该是这里的重点。

为了通知CMake有关xerces库文件的信息,我尝试了

link_directories("C:\Xerces\xerces-c-3.2.2\xerces-c-3.2.2\src\Release")

在顶级CMakeLists中.txt我尝试了

target_link_libraries(SAXPrint "C:\Xerces\xerces-c-3.2.2\xerces-c-3.2.2\src\Release")

(最后一个似乎没有被接受,因为Visual Studio然后不断显示消息"生成CMake缓存以刷新"(,并且我已经阅读了一些我不理解的有关CMake"find_library"命令的内容。

我收到的错误消息是

Error   LNK2019 unresolved external symbol "__declspec(dllimport) public: static char const * const xercesc_3_2::XMLUni::fgXercescDefaultLocale" (__imp_?fgXercescDefaultLocale@XMLUni@xercesc_3_2@@2QBDB) referenced in function main  C:UsersstefansourcereposSAXPrint   C:UsersstefansourcereposSAXPrint.cpp.obj   1   

因此,任何如何使用Xerces库文件的评论都是非常受欢迎的,但如果有人有一个与Xerces Version 3和Visual Studio 2019一起使用的完整示例CMake项目,那就更好了。我更喜欢CMake项目,因为这似乎是我想完成的更好的选择。谢谢。

我为简单的"SAXPrint"示例找到了一个可行的解决方案,如果您不尝试使用添加整个目录或尝试让 CMake 找到某种已安装的库,它实际上非常简单:

顶级CMakeLists.txt:

cmake_minimum_required (VERSION 3.8)
project(SAXPrint)
add_subdirectory ("SAXPrint")

CMakeLists.txt在子目录"SAXPrint"中,其中包含示例源文件:

cmake_minimum_required (VERSION 3.8)
include_directories("C:\Xerces\xerces-c-3.2.2\xerces-c-3.2.2\src")
add_executable(SAXPrint "SAXPrintHandlers.cpp" "SAXPrint.cpp")
target_link_libraries(SAXPrint "C:\Xerces\xerces-c-3.2.2\xerces-c-3.2.2\src\Release\xerces-c_3.lib")

(是的,应该避免在CMakeList.txt中使用绝对路径,但这是一个单独的问题,应该很容易解决,例如,通过将Xerces的路径作为CMake的参数。

所以我只是给出 Xerces 3 的一个库文件的绝对路径作为target_link_libraries中的参数。我想,如果我使用另一个库文件,我只会添加另一个路径(所以我为Xerces 2添加了许多使用其中许多的库文件(?但是这些库的依赖关系呢?也许这个解决方案并不是它真正期望的使用方式,我想CMake必须了解依赖项,并且在一般情况下仅提供库文件列表并不能解决它?

请注意,在我的情况下,Xerces 没有以任何方式"安装",它(对于我的意思应该是(只是一个目录,其中包含某些子目录中所需的文件,而没有任何环境变量指向它。所以我想find_package不是我可以使用的东西,那find_library呢?

或者如果我只是继续使用target_link_libraries(实际上应该使用例如find_package据我了解(应该按什么顺序列出库文件,以便尊重依赖项?