C++ Cmake如何查找文件?

C++ Cmake如何查找文件?,c++,cmake,C++,Cmake,我正在尝试使用cmake编译freepv() freepv需要一些模块,如zlib。我下载了这个模块的开发者版本,并将其复制到我的硬盘上 cmake中包含一个文件,告诉cmake在哪里可以找到zlib库 ######################################################################### # # # FreePV's

我正在尝试使用cmake编译freepv()

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等平台上,因为上面的脚本对这两个部分的处理方式不同

让我们从非窗口开始:

FIND_PATH(ZLIB_INCLUDE_DIR zlib.h
    /usr/local/include
    /usr/include
)
这只是在两个给定目录中搜索名为
zlib.h
的文件,并将CMAKE变量zlib_INCLUDE_DIR设置为找到该文件的目录

同样的事情也发生在库中,但奇怪的是,为了好玩,反过来又发生了同样的事情(看起来像一个bug,想象一下您在/usr/lib和/usr/local/lib中安装了zlib,这将包含和两个不同版本的库混在一起)

因此,简单的方法是只调用
FindZLIB
,这样效果更好。。。(见附件)

对于Windows平台来说,这也很奇怪:

FIND_PATH(ZLIB_INCLUDE_DIR zlib.h 
    ${CMAKE_INCLUDE_PATH} 
    $ENV{include}
)
这将在CMAKE_include_PATH(请参阅)中设置的所有默认include目录中查找
zlib.h
文件,如果未在其中找到该文件,则在环境变量
include
中设置的路径中查找

SET(ZLIB_NAMES z zlib zlib1 zlib1d zdll)
FIND_LIBRARY(ZLIB_LIBRARY
    NAMES ${ZLIB_NAMES} 
    PATHS ${CMAKE_LIBRARY_PATH} $ENV{lib}
) 
对于类似的dll列表,此时将搜索CMAKE_LIBRARY_路径或环境变量LIB的内容

但是,如果你已经知道正确的道路,你可以简单地做:

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

忽略上面的全部代码…

好吧,CMake实际上已经有了自己的逻辑来查找ZLIB,所以这可能只是项目中的老东西()。但是如果您只需要查找路径的文档,它们就在这里
SET(ZLIB_INCLUDE_DIR /path/to/the/zlib/include/dir)
SET(ZLIB_LIBRARIES /path/to/the/libary)
SET(ZLIB_FOUND TRUE)