https://cmake.org/cmake/help/latest/module/CheckLibraryExists.html
这个方法是在Modules/CheckLibraryExists.cmake文件里定义的一个宏。
最终使用的方法是通过现场编译一个文件,里面调用所需要的函数,链接时,使用-labc链接库,然后确定这个库有没有在编译环境安装。其实是分成两步,一个是找相应的.a/.so文件,一个是寻找相应的函数定义。
比如下面这个例子,就是要看“pcre2_match_8” 函数有没有定义,根据输出结果来判断,有没有:
CHECK_LIBRARY_EXISTS(pcre2-8 pcre2_match_8 “” HAVE_PCRE2)
如果没有指定目录,可能会在目录:/usr/lib/gcc/x86_64-redhat-linux/8/…/…/…/…/lib64/libpcre2-8.so
if(${VARIABLE})
if(NOT CMAKE_REQUIRED_QUIET)
message(CHECK_PASS "found")
endif()
set(${VARIABLE} 1 CACHE INTERNAL "Have library ${LIBRARY}")
else()
if(NOT CMAKE_REQUIRED_QUIET)
message(CHECK_FAIL "not found")
endif()
set(${VARIABLE} "" CACHE INTERNAL "Have library ${LIBRARY}")
endif()
对应的源文件是 CheckFunctionExists.c
#ifdef CHECK_FUNCTION_EXISTS
# ifdef __cplusplus
extern "C"
# endif
char
CHECK_FUNCTION_EXISTS(void);
# ifdef __CLASSIC_C__
int main()
{
int ac;
char* av[];
# else
int main(int ac, char* av[])
{
# endif
CHECK_FUNCTION_EXISTS();
if (ac > 1000) {
return *av[0];
}
return 0;
}
#else /* CHECK_FUNCTION_EXISTS */
# error "CHECK_FUNCTION_EXISTS has to specify the function"
#endif /* CHECK_FUNCTION_EXISTS */
/usr/bin/cc -pie -fPIC -fstack-protector --param=ssp-buffer-size=4 -DCHECK_FUNCTION_EXISTS=pcre2_match_8 -o CMakeFiles/cmTC_554e1.dir/CheckFunctionExists.c.o -c /usr/share/cmake/Modules/CheckFunctionExists.c
/usr/bin/cc -pie -fPIC -fstack-protector --param=ssp-buffer-size=4 -DCHECK_FUNCTION_EXISTS=pcre2_match_8 -export-dynamic CheckFunctionExists.c.o -o cmTC_554e1 -lpcre2-8
/usr/bin/ld: cannot find -lpcre2-8 “根据 这里的 not find”来判断是否有相关的library。
collect2: error: ld returned 1 exit status
因为rpm是专门RHEL提供的命令,其他平台不适应。
这里需要注意,不能直接使用nm,不加任何参数来查看so文件里是否有这个这个符号而应该加上一个参数:–dynamic。
nm --demangle --dynamic --extern-only <lib.so>
这个可以显示动态库里的动态符号
[root@qrms6-host01 lib64]# nm -D --defined-only libpcre2-8.so.0.7.1 | grep match
00000000000196c0 T pcre2_dfa_match_8
0000000000043e80 T pcre2_jit_match_8
0000000000044d60 T pcre2_match_8