FIND_LIBRARY()是一个用于查找.a,和.so库的CMAKE命令。
常用的用法如下:
(1)、查找.so库
FIND_LIBRARY(G2O_SOLVER_EIGEN_LIB
NAMES g2o_solver_eigen # lib前缀 和后缀名 .so 不需要写
PATHS /usr/local
PATH_SUFFIXES lib)
G2O_SOLVER_EIGEN_LIB:查找到库文件后,这个名字就是这个库的别名。
NAMES:为要查找的.so库标识名,注意要把lib前缀和.so后缀去掉,比如在这个例子中,查找的就是
libg2o_solver_eigen.so库。
PATHS:即查找的父目录。
PATH_SUFFIXES:指定了要搜索的子目录名称。
在这个例子中,PATH_SUFFIXES设置为lib,PATHS为/usr/local ,因此CMake将先去/usr/local/lib目录下搜索名为libg2o_solver_eigen.so库文件,并且,如没没有搜索到,CMAKE将去默认的预设路径下查找,这个路径一般包括 /usr/lib 和 /usr/local/lib 等。
如果不希望FIND_LIBRARY去默认的系统路径下查找则要加上NO_DEFAULT_PATH参数,如下:
FIND_LIBRARY(G2O_SOLVER_EIGEN_LIB
NAMES g2o_solver_eigen # lib前缀 和后缀名 .a需要保留
PATHS /usr/local
PATH_SUFFIXES lib
NO_DEFAULT_PATH)
(2)、.a库
和.so库类似,不过,NAMES指定的库标识名就不能把.a后缀和lib前缀去掉了,比如一个叫libg2o_solver_eigen.a的库,那么查找的指令为:
FIND_LIBRARY(G2O_SOLVER_EIGEN_LIB
NAMES libg2o_solver_eigen.a # lib前缀 和后缀名 .so 不需要写
PATHS /usr/local
PATH_SUFFIXES lib)
FIND_PATH用于查找文件或目文件夹的路径。
比如,我们要去寻找安装在/usr/local/include的g2o文件夹路径,可以使用:
FIND_PATH(G2O_INCLUDE_DIR
NAMES g2o
PATHS /usr/local/include
NO_DEFAULT_PATH)
G2O_INCLUDE_DIR:保存最终找到的路径,找不到的话为空
NAMES g2o:文件夹的名字是g2o
PATHS /usr/local/include:查找的目录是 /usr/local/include
NO_DEFAULT_PATH: 表示不会去系统默认的路径下搜索,而只在 PATHS下搜索
此外,可以判断是否查找成功,若失败则直接退出。
IF (G2O_INCLUDE_DIR)
message(FATAL_ERROR "Could not find g2o include directory!")
ENDIF (G2O_INCLUDE_DIR)
可以看到FIND_LIBRARY和FIND_PATH都有一个参数-PATH_SUFFIXES,那么这个参数什么时候该用什么时候不该用呢?
下面是一个实例:
假设你想在两个目录 /usr/local 和 /opt/local 下查找名为 g2o 的文件或文件夹,且这两个目录都有一个名为 include 的子目录。你可以使用下面的 FIND_PATH 函数来完成这个任务:
FIND_PATH(G2O_INCLUDE_DIR
NAMES g2o
PATHS /usr/local /opt/local
PATH_SUFFIXES include
NO_DEFAULT_PATH)
在这个例子中,PATHS 选项指定了两个查找路径 /usr/local 和 /opt/local,而 PATH_SUFFIXES 选项指定了一个路径后缀 include。这意味着 FIND_PATH 函数会在 /usr/local/include 和 /opt/local/include 这两个目录下查找名为 g2o 的文件或文件夹。
如果不使用 PATH_SUFFIXES 选项,那么你需要手动指定这两个完整的查找路径,如下所示:
FIND_PATH(G2O_INCLUDE_DIR
NAMES g2o
PATHS /usr/local/include /opt/local/include
NO_DEFAULT_PATH)
可以看到,第二种显然复杂多了,因此,使用 PATH_SUFFIXES 选项可以让你更简洁地指定查找路径,
同时,如果搜索路径就一个,那么直接选用PATHS进行指定就可以。