如果依赖的库在非系统库中,默认情况下,cmake是找不到的,或者找到的是系统库下不想要的,比如使用交叉编译工具编译的某些开源库,安装在某个单独目录中,此时默认cmake查找的话,是找不到自己编译的库的。此时,需要设置两个环境变量,指定搜索位置:
CMAKE_PREFIX_PATH
:可以用于find_package
,find_library
和find_path
。路径设置可以包含最终lib所在目录(即类似于/opt/abc/lib/
这样的目录),也可以是lib所在目录的上一层目录(即类似于/opt/abc/
这样的目录,此时abc目录下必须有lib名称的目录才行。另外,如果库是在abc目录下的一个非lib目录下,比如/opt/abc/x64/
,则这样不行,只能全路径才行);CMAKE_MODULE_PATH
:用于find_package
中为MODULE
的情况;CMAKE_FIND_ROOT_PATH
:可以用于find_package
,find_library
和find_path
。且只能是lib目录上层的目录(即如果库在/opt/abc/lib/
下面,则传入的路径只能是/opt/abc/
,千万不能包含lib。如果库不在lib目录下,则此变量找不到对应的库)。
如果直接通过set设置,则默认位置会被清空,只会搜索设置的位置:
set(CMAKE_PREFIX_PATH /opt/abc/lib)
如果只是想将单独目录加到可搜索路径中,则用list:
list(APPEND CMAKE_PREFIX_PATH /opt/def/lib)
特别地,对应交叉编译环境来说,一般通常会设置CMAKE_FIND_ROOT_PATH_MODE_LIBRARY
为ONLY:
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
此时由于设置了CMAKE_FIND_ROOT_PATH_MODE_LIBRARY
为ONLY,则此后面使用find_library寻找第三方库的时候,不论是否传入了路径,也不论是否设置了CMAKE_PREFIX_PATH
,都无法找到,因为此时find_library只会从CMAKE_FIND_ROOT_PATH
设置的路径中寻找。此时如果想用find_library找到第三方库,要么将CMAKE_FIND_ROOT_PATH_MODE_LIBRARY
设置为NEVER,要么将第三方库路径添加到CMAKE_FIND_ROOT_PATH
中(推荐添加到CMAKE_FIND_ROOT_PATH
)。对于CMAKE_FIND_ROOT_PATH_MODE_INCLUDE
之于find_path
,同样的道理。