c - 无法使用共享 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 上运行有关。
解决方案
推荐阅读
- excel - 使用vba计算到期日期
- pine-script - 仅当当前屏幕分辨率小于 60 分钟时才想使用函数“timeframe.period”显示 vwap
- javascript - 在 vue 中过滤 JSON 对象以计算新对象
- oracle - Hyperion 错误:EPMHFM-66024 - 用户配置的端口范围内没有可用端口:10001-10020
- r - 根据组中某些列上某些行的值创建新变量
- c# - 尝试激活“Schutters.Controllers.ClubController”时无法解析“Schutters.Models.SchuttersContext”类型的服务
- docker - 在 Yocto 中将文件添加到系统映像
- typescript - 使用 Jest 在 typescript 中进行单元测试
- google-bigquery - 如果我们在 BigQuery 中使用具有相同分区类型(天)的另一个列进行过滤,那么 where 子句中的分区列是否不是必需的?
- json - 没有为参数evidence$2找到隐含: BodyWritable[Map[String, Object]]