Linux: dev: cmake: CHECK_LIBRARY_EXISTS
简介
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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!