什么是-lnuma,有哪些程序在编译时使用它?

5

我正在使用openmpi和mpicxx在Linux桌面上编译一个消息传递程序。我的makefile执行以下操作:

mpicxx -c readinp.cpp
mpicxx -o exp_fit driver.cpp readinp.o 

此时我收到以下错误:

/usr/lib64/gcc/x86_64-suse-linux/4.5/../../../../x86_64-suse-linux/bin/ld: cannot find -lnuma

我的问题是:

-lnuma是什么?它被用来做什么?我该如何链接它?

4个回答

7

感谢Jonathan Dursi!

在Ubuntu上,包名为libnuma-dev。
apt-get install libnuma-dev


4
构建脚本找不到 NUMA(非一致性内存访问)库。-l 选项告诉链接器链接该库,但您的系统可能未安装合适的库或链接器的搜索路径不完整/错误。
请尝试查询您的软件包管理器 (apt 或 rpm) 是否有 libnuma 软件包。

我知道其他人已经在这个系统上使用OpenMPI编译过了。是不是我的用户账户没有权限呢?我需要添加库所在路径吗?如果需要,我该如何找到这个路径? - drjrm3
这可能取决于您的发行版,您可以在哪里找到这些内容。大多数发行版将二进制文件和头文件分别打包成像“libnuma”和“libnuma-devel”这样的软件包。尝试搜索两者。如果已安装,则应能够查询路径(例如rpm -ql libnuma或dpkg -L libnuma)。 - Mithrandir

2
OpenMPI和mpich2使用libnuma(“一个简单的编程接口,用于Linux内核支持的NUMA(非一致性内存访问)策略”)进行内存亲和性--以确保特定MPI任务的内存保持靠近运行任务的核心,而不是完全保留在另一个插座的缓存中。这对于多核节点的性能非常重要。
如果您的链接器找不到库,则可能需要使用YaST安装libnuma-devel。

2
我在远程服务器上工作时遇到了相同的错误,该服务器安装了NUMA库。特别是文件/usr/lib64/libnuma.so.1存在。似乎链接器只查找名为libnuma.so的文件。创建符号链接即可。
ln -s /usr/lib64/libnuma.so.1 /usr/lib64/libnuma.so

此处所述可能有效,但在我的情况下,我没有权限在/usr/lib64中创建文件。我通过在具有写入权限的其他位置创建符号链接来解决了这个问题:

ln -s /usr/lib64/libnuma.so.1 /some/path/libnuma.so

然后将此路径添加到编译标志中。在您的情况下,这将是

mpicxx -L/some/path -o exp_fit driver.cpp readinp.o

在我进行较大的构建过程(编译 fftw)时,我将路径添加到 LDFLAGS 环境变量中。
export LDFLAGS="${LDFLAGS} -L/some/path"

修复了这个问题。


1
正确的解决方法是让您的系统管理员安装开发包(在Ubuntu上为libnuma-dev,在RHEL中为numactl-devel,...)。 libnuma 用于构建Open MPI,但大多数MPI应用程序不太可能直接使用它(这意味着在运行时仅需要libnuma.so.1)。 - Gilles Gouaillardet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接