我写了一个小的c文件来测试DRMAA,但它一直告诉我,我使用的DRMAA函数没有定义。我把drmaa.h文件包含在C代码中。当我使用-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;
}
最佳答案
在第一种情况下,链接器告诉它不知道在哪里可以找到drmaa
库。在第二种情况下,由于您没有包含drmaa
库,链接器告诉您它不知道如何解析您正在使用的drmaa
函数。
您需要找出drmaa
库文件的位置,即在哪个目录中。
一旦知道了这一点,就可以在编译/链接时指定-L/path/to/drmaa/directory
来解决问题。
根据布赖恩·凯恩的回答,库(drmaa.a
或drmaa.so
)可能在$SGE_ROOT/lib
之下。
最后,由于存储库的目录不在系统的标准库搜索路径中,因此在运行可执行文件时,必须告诉动态链接器在哪里找到库。实现这一目标有两种方法:
将LD_LIBRARY_PATH环境变量设置(并导出)到库的目录(例如$SGE_ROOT/lib
)
或者在编译/链接时添加-R/path/to/drmaa/directory
选项。