1

我写了一个小 c 文件来测试 DRMAA,但它一直告诉我我使用的 DRMAA 函数没有定义。我在 C 代码中包含了 drmaa.h 文件。当我使用 -idrmaa 时出现此错误:

[mkatouzi@argo-1 ~]$ cc -o drmtest -I$SGE_ROOT/include/ -ldrmaa -ldl drmtest.c
/usr/bin/ld: cannot find -ldrmaa

DRMAA 头文件位于此路径中:$SGE_ROOT/include/

如果我在没有 -ldrmaa 的情况下编译文件,我会收到此错误:

[mkatouzi@argo-1 ~]$ cc -o drmtest -I$SGE_ROOT/include/  drmtest.c
/tmp/cclsPr9O.o: In function `main':
drmtest.c:(.text+0x3c): undefined reference to `drmaa_init'
drmtest.c:(.text+0x83): undefined reference to `drmaa_exit'
collect2: ld returned 1 exit status

我正在使用我学校的 UNIX 系统,我对它很陌生。谁能帮我这个?

这是我的 drmtest.c 文件:

#include <stdio.h>
#include "drmaa.h"


int main (int argc, char **argv) {


char error[DRMAA_ERROR_STRING_BUFFER];
int errnum = 0;
errnum = drmaa_init (argv[0], error, DRMAA_ERROR_STRING_BUFFER);
if (errnum != DRMAA_ERRNO_SUCCESS) {
    fprintf (stderr, "Couldn't init DRMAA library: %s\n", error);
return 1; }
/* Do Stuff */
errnum = drmaa_exit (error, DRMAA_ERROR_STRING_BUFFER);
if (errnum != DRMAA_ERRNO_SUCCESS) {
    fprintf (stderr, "Couldn't exit DRMAA library: %s\n", error); 
return 1; }
return 0;
}
4

2 回答 2

0

在第一种情况下,链接器是您告诉它不知道在哪里可以找到drmaa库。在第二种情况下,由于您没有包含drmaa库,链接器告诉您它不知道如何解析drmaa您正在使用的函数。

您需要弄清楚drmaa库文件在哪里,即在哪个目录中。

一旦知道这一点,您就可以指定-L/path/to/drmaa/directory何时编译/链接以解决问题。

根据 Brian Cain 的回答,图书馆 (drmaa.adrmaa.so) 可能在$SGE_ROOT/lib.

最后,由于存储库的目录不在系统的标准库搜索路径中,因此您必须在运行可执行文件时告诉动态链接器在哪里找到该库。有两种方法可以实现这一点:

  • 将 LD_LIBRARY_PATH 环境变量设置(并导出)到库的目录(例如$SGE_ROOT/lib

  • 或者-R/path/to/drmaa/directory在编译/链接时添加选项。

于 2014-10-03T14:14:44.840 回答
0

您可能需要指定libdrmaa.so找到的库路径。

例如

cc -o drmtest -I$SGE_ROOT/include/ -L$SGE_ROOT/lib/ -ldrmaa -ldl drmtest.c

如果您在链接库时遇到运行时问题,您应该检查您的系统配置。

LD_LIBRARY_PATH环境变量可以在紧要关头使用,但在许多现代系统上,您可以/应该使用ld.so.conf.

例如

echo <<EOF > /etc/ld.so.conf.d/sge.conf
/usr/sge/lib
EOF
于 2014-10-03T14:15:34.187 回答