Linux: dev: cmake: CHECK_LIBRARY_EXISTS

发布时间:2023年12月24日

简介

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查看包呢?

因为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

文章来源:https://blog.csdn.net/qq_36428903/article/details/134946792
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。