c++ - 使用 FindLibrary.cmake 添加非标准库到 cmake

标签 c++ cmake shared-libraries

我想在我的代码中使用树解析库 (NHParser)。我已经在/home/ikram/parser 中安装了库(在/home/ikram/parser/include/NHparser/中包含文件,在/home/ikram/parser/lib/目录中包含 lib 文件)。 我想知道,首先,我是否可以在我的主 CMakeLists.txt 文件中添加库和包含文件而不求助于 FindNHPARSER.cmake 脚本?如果是,我该如何实现?

我尝试了上面的方法,但没有成功,所以我像下面这样写了 FindNHPARSER.cmake。

find_path(NHPARSER_INCLUDE_DIR include/NHparser/NHparser.h
                    HINTS PATH_SUFFIXES NHparser)
find_library(NHPARSER_LIBRARY NAMES NHparser)

set(NHparser_LIBRARIES ${NHparser_LIBRARY})
set(NHparser_INCLUDE_DIRS ${NHparser_INCLUDE_DIR})
include(FindPackageHandleStandardArgs)
mark_as_advanced(NHparser_INCLUDE_DIR NHparser_LIBRARY )

写对了吗?我如何将它包含在我的主要 CMakeLists.txt 脚本中,我是否需要在运行 cmake 时设置 CMAKE_MODULE_PATH?

感谢您的宝贵时间。

最佳答案

对于如此小的(相当标准的)查找过程,我只是将代码直接添加到主 CMakeLists.txt。

如果您愿意,您可以将它移动到一个单独的 .cmake 文件中 - 那么您只需 include该文件位于主 CMakeLists.txt 中的适当位置。

至于代码,我会保持简单;本质上只是一个 find_pathfind_library调用并检查是否确实找到了相关内容:

find_path(NHPARSER_INCLUDE_DIR NAMES NHparser.h PATH_SUFFIXES NHparser)
if(NOT NHPARSER_INCLUDE_DIR)
  message(FATAL_ERROR "Didn't find NHparser.h")
endif()

find_library(NHPARSER_LIBRARY NAMES NHparser)
if(NOT NHPARSER_LIBRARY)
  message(FATAL_ERROR "Didn't find NHparser library")
endif()

您可以使用以下变量:

include_directories(${NHPARSER_INCLUDE_DIR})
...
target_link_libraries(MyExe ${NHPARSER_LIBRARY})

虽然这些变量不太可能在没有帮助的情况下被发现,因为这个库在你机器上的安装前缀似乎是“/home/ikram/parser”。由于此位置可能特定于您自己的计算机,因此我不会将其硬编码到您的 CMakeLists.txt 中。

相反,要让 CMake 将该路径添加到默认搜索路径列表,只需设置 CMAKE_PREFIX_PATH当您调用 CMake 时:

cmake . -DCMAKE_PREFIX_PATH=/home/ikram/parser

关于c++ - 使用 FindLibrary.cmake 添加非标准库到 cmake,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17732039/

相关文章:

python - 如何在 Centos 6.8 上安装 OpenCV 3?

linux - 静态库 (.a) 和共享库 (.so) 之间的文件格式差异?

c++ - begin() 与 rbegin() 它们是如何实现的?

java - Android Java 应用程序带有 C++ 纯头库?

c++ - 如何在没有 QtCreator 的情况下编译 Qt 5 项目?

在 CMake 中创建一个包含所有静态链接(包括 libc)的 .so 文件

c++ - 如何在 C++ 中创建在命名空间内定义的类的对象

c++ - 为什么 sizeof(Base) 与 sizeof(Derived) 没有区别

linux - 可执行文件和共享库有什么区别

c++ - 导入 .so 时导入语句的顺序是否重要?