首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在运行时检测C++中的库功能

在运行时检测C++中的库功能
EN

Stack Overflow用户
提问于 2012-12-19 02:05:14
回答 1查看 871关注 0票数 6

我正在尝试用C语言构建一个程序,它有很多依赖于各种共享库的可选功能。

在我们的异构计算集群中,并非所有这些库在所有系统上都可用(或最新)。

例如,来自较新的glibc (sched_getcpu@@GLIBC_2.6__sched_cpucount@@GLIBC_2.6)或整个共享库(libnumalibRlibpbs)的符号可能是可用的,也可能是不可用的。

我知道我可以使用libdl通过dlopendlsym来加载符号,但是对于越来越多的符号(目前大约有30个)来说,这样做充其量也是乏味的。

据我所知,Linux中的共享库在默认情况下是延迟加载的,因此在实际使用符号之前应该不需要它。

但是如果我尝试提前检查它,那么它在执行开始时就会失败:

代码语言:javascript
复制
#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <dlfcn.h>
#include <sched.h>

int main() {

    void *lib_handle;
    int (*fn)(void);
    int x;
    char *error;

    lib_handle = dlopen("libc.so.6", RTLD_LAZY);
    if (!lib_handle) 
    {
       fprintf(stderr, "%s\n", dlerror());
       exit(1);
    }

    fn = dlsym(lib_handle, "sched_getcpu");
    if ((error = dlerror()) != NULL)  
    {
       fprintf(stderr, "%s\n", error);
       exit(1);
    }

    printf("%d\n", sched_getcpu());

    return 0;
}

在包含所有库的编译系统上:

代码语言:javascript
复制
$ icc test.c
$ ./a.out
10

在另一个具有较新版本的GLIBC的系统上:

代码语言:javascript
复制
$ ./a.out 
./a.out: /lib64/libc.so.6: version `GLIBC_2.6' not found (required by ./a.out)

如果我注释掉实际调用sched_getcpu的代码行,那么我会在较小的系统上得到:

代码语言:javascript
复制
$ ./a.out 
/lib64/libc.so.6: undefined symbol: sched_getcpu

那么,有没有一种方法可以强制库只在使用时加载,并在使用它们的块之前进行这样的检查?

EN

回答 1

Stack Overflow用户

发布于 2012-12-19 02:19:58

不能用glibc。这是一个故障保险,它的位置,这样你就不会击中自己的脚。如果没有定义和查找GLIBC_2.6符号,即使没有其他丢失的符号,也可能会从glibc得到垃圾结果(数据损坏和崩溃),因为它不向前兼容。

如果您需要glibc级别的兼容性,则需要使用最低的通用版本进行构建。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13938860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档