gpt4 book ai didi

c++ - Cmake 是如何查找文件的?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:53:56 24 4
gpt4 key购买 nike

我正在尝试使用 cmake 编译 freepv ( http://freepv.sourceforge.net/)。

freepv 需要一些模块比如zlib。我下载了该模块的开发者版本并将其复制到我的硬盘中。

cmake 中包含一个文件,告诉 cmake 在哪里可以找到 zlib 库。

#########################################################################
# #
# FreePV's Script #
# #
#***********************************************************************#
# This FreePV script tries to find jpeg library and header files #
# ZLIB_INCLUDE_DIR, headers path. #
# ZLIB_LIBRARIES, libraries needed. #
# ZLIB_FOUND, either true or false. #
#########################################################################

IF(WIN32)
FIND_PATH(ZLIB_INCLUDE_DIR zlib.h
${CMAKE_INCLUDE_PATH}
$ENV{include}
)
SET(ZLIB_NAMES z zlib zlib1 zlib1d zdll)
FIND_LIBRARY(ZLIB_LIBRARY
NAMES ${ZLIB_NAMES}
PATHS ${CMAKE_LIBRARY_PATH} $ENV{lib}
)
ELSE(WIN32)

FIND_PATH(ZLIB_INCLUDE_DIR zlib.h
/usr/local/include
/usr/include
)
SET(ZLIB_NAMES z zlib zdll)
FIND_LIBRARY(ZLIB_LIBRARY
NAMES ${ZLIB_NAMES}
PATHS /usr/lib /usr/local/lib
)

ENDIF(WIN32)

IF (ZLIB_INCLUDE_DIR AND ZLIB_LIBRARY)
SET(ZLIB_FOUND TRUE)
SET(ZLIB_LIBRARIES ${ZLIB_LIBRARY})
ENDIF (ZLIB_INCLUDE_DIR AND ZLIB_LIBRARY)

IF(NOT ZLIB_FOUND)
IF (ZLIB_FIND_REQUIRED)
MESSAGE(FATAL_ERROR "Could not find ZLIB")
ENDIF (ZLIB_FIND_REQUIRED)
ENDIF(NOT ZLIB_FOUND)

我的问题是:

我应该在哪里复制我为 zlib 下载的文件?

我可以在硬盘中复制一些内容,然后设置一个名为:ZLIB_INCLUDE_DIR 的环境变量吗?

CMake FIND_PATH 是如何工作的?

最佳答案

您没有说明您是在 Windows 还是 Linux/Unix 等平台上,因为上面的脚本对这两个部分执行不同的操作。

让我们从非 Windows 开始:

FIND_PATH(ZLIB_INCLUDE_DIR zlib.h
/usr/local/include
/usr/include
)

这只是搜索一个名为 zlib.h 的文件在给定的两个目录中,并将 CMAKE 变量 ZLIB_INCLUDE_DIR 设置为找到文件的目录。

同样的事情发生在库中,但奇怪的是相反的乐趣(看起来像一个错误,假设你在/usr/lib 和/usr/local/lib 中安装了 zlib,这混淆了两个的包含和库不同的版本)。

SET(ZLIB_NAMES z zlib zdll)
FIND_LIBRARY(ZLIB_LIBRARY
NAMES ${ZLIB_NAMES}
PATHS /usr/lib /usr/local/lib
)

所以简单的方法就是调用 FindZLIB相反,哪个效果更好……(参见 http://www.cmake.org/cmake/help/cmake2.6docs.html#module:FindZLIB)。

对于 Windows 平台,它也很奇怪:

FIND_PATH(ZLIB_INCLUDE_DIR zlib.h 
${CMAKE_INCLUDE_PATH}
$ENV{include}
)

这会查找 zlib.h CMAKE_INCLUDE_PATH 中设置的所有默认包含目录中的文件(参见 http://www.cmake.org/Wiki/CMake_Useful_Variables ),如果在那里找不到,则在环境变量中设置的路径中 include .

SET(ZLIB_NAMES z zlib zlib1 zlib1d zdll)
FIND_LIBRARY(ZLIB_LIBRARY
NAMES ${ZLIB_NAMES}
PATHS ${CMAKE_LIBRARY_PATH} $ENV{lib}
)

dll ist类似,只是这次搜索CMAKE_LIBRARY_PATH或者环境变量LIB的内容。

但是,是的,如果您已经知道正确的路径,您可以简单地执行以下操作:

SET(ZLIB_INCLUDE_DIR /path/to/the/zlib/include/dir)
SET(ZLIB_LIBRARIES /path/to/the/libary)
SET(ZLIB_FOUND TRUE)

并忽略上面的整个代码...

关于c++ - Cmake 是如何查找文件的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23199627/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com