首页 > 解决方案 > 无法使用共享 C 库中的函数 cpuset_create

问题描述

我正在尝试将 C 项目从 CentOS 7 (Core) 移植到 Ubuntu 20.04.1 LTS (Focal Fossa) 系统。该程序在 CentOS 上编译和运行没有问题,在 Ubuntu 系统上也编译没有错误。但是,当我尝试在 Ubuntu 上执行程序时,遇到以下错误:

ERROR aff_prog_alloc @aff-executor.c:299 => cpuset_create: No such file or directory

该函数cpuset_create是库的一部分,编译时包含<cpuset.h>标志。-lcpuset以下是 ldd 命令的输出,显示了<cpuset.h>库在我们的 Ubuntu 系统上的路径:

$ ldd ./aff-executor
    linux-vdso.so.1 (0x00007ffed97eb000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f8c179d5000)
    libcpuset.so.1 => /lib/x86_64-linux-gnu/libcpuset.so.1 (0x00007f8c177c8000)
    libbitmask.so.1 => /lib/x86_64-linux-gnu/libbitmask.so.1 (0x00007f8c175c4000)
    libnuma.so.1 => /lib/x86_64-linux-gnu/libnuma.so.1 (0x00007f8c175b7000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f8c175ac000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8c173ba000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f8c17a22000)

我验证了该库实际上存在于该位置:

$ll /lib/x86_64-linux-gnu/libcpuset.*
    -rw-r--r-- 1 root root 67952 Nov 21  2016 /lib/x86_64-linux-gnu/libcpuset.a
    lrwxrwxrwx 1 root root    18 Nov 21  2016 /lib/x86_64-linux-gnu/libcpuset.so -> libcpuset.so.1.1.0
    lrwxrwxrwx 1 root root    18 Nov 21  2016 /lib/x86_64-linux-gnu/libcpuset.so.1 -> libcpuset.so.1.1.0
    -rw-r--r-- 1 root root 52232 Nov 21  2016 /lib/x86_64-linux-gnu/libcpuset.so.1.1.0

任何人都可以帮助确定为什么cpuset_create尽管它具有正确的语法和输入,但它不能在这个系统上工作吗?

===================================
更新/附加信息

以下代码是我需要用于我的项目的代码。一切正常,直到cpuset_create函数返回-1。我在另一个 Ubuntu (16.04.5 LTS (Xenial Xerus)) 上检查了这个程序,它在上面执行没有问题,cpuset_create返回了预期的0.

#define _GNU_SOURCE

#include<stdio.h>
#include <bitmask.h>
#include <cpuset.h>
#include <errno.h>
#include<numa.h>

typedef struct cpuset        cpuset_t;
struct bitmask * get_mems_all(void);

/* return a bitmask describing all the available memory nodes */
struct bitmask * get_mems_all(void)
{
    struct bitmask *ret;

    if (numa_available() != -1){
        printf("NUMA is available\n");
        return numa_get_mems_allowed();
    }

    ret = bitmask_alloc(cpuset_mems_nbits());
    printf("ret: %p\n",ret );
    if (!ret)
        printf("bitmask_alloc err");
    bitmask_setbit(ret,0);
    return ret;
}

int main(){

    int err;
    struct bitmask  *mem_bm;

    mem_bm=get_mems_all();
    printf("mem_bm: %p\n",mem_bm );

    numa_bitmask_clearbit(mem_bm, 1);
    numa_bitmask_setbit(mem_bm,0);
    char buff[256];
    bitmask_displaylist(buff, sizeof(buff), mem_bm);
    printf("buff: %s\n",buff );

    printf("mem_bm: %p\n",mem_bm );

    printf("cpuset lib version: %d\n",cpuset_version() );

    cpuset_t *cpuset=cpuset_alloc();
    printf("cpuset: %p\n",cpuset );

    err = cpuset_setmems(cpuset,mem_bm);
    printf("err cpuset_setmems: %d\n", err);

    char* path="/AFF_1000/";
    err = cpuset_create(path, cpuset);
    printf("err cpuset_create: %d\n", err);

    return 0;
}

汇编:

gcc -Wall -O2 -std=gnu99 test.c -o test -lcpuset -lbitmask -lnuma

Ubuntu 20.04.1 LTS(Focal Fossa)上的输出:

$./test
NUMA is available
mem_bm: 0x55a34b2ac120
buff: 0
mem_bm: 0x55a34b2ac120
cpuset lib version: 3
cpuset: 0x55a34b2ac1d0
err cpuset_setmems: 0
err cpuset_create: -1

预期输出(来自 Ubuntu 16.04LTS (Xenial Xerus)):

$./test
NUMA is available
mem_bm: 0x1c39670
buff: 0
mem_bm: 0x1c39670
cpuset lib version: 3
cpuset: 0x1c396b0
err cpuset_setmems: 0
err cpuset_create: 0

$cset set -l
cset: 
         Name       CPUs-X    MEMs-X Tasks Subs Path
 ------------ ---------- - ------- - ----- ---- ----------
         root       0-63 y     0-1 y   500    2 /
     AFF_1000      ***** n       0 n     0    0 /AFF_1000
       system       0-63 n       0 n   349    0 /system

但是,我也无法在 Ubuntu 16.04 上运行与 root 相同的程序。我收到以下错误:

sudo ./test
./test: error while loading shared libraries: libcpuset.so.1: cannot open shared object file: No such file or directory

有谁知道为什么会这样?我不知道最后一个问题是否与为什么我的程序无法在 Ubuntu 20.04 上运行有关。

标签: clinuxshared-libraries

解决方案


推荐阅读