GNU Scientific Library未定义对xx问题的引用

时间:2016-05-05 18:03:09

标签: gsl

我正在与GSL挣扎,我在Ubuntu 14.04上刚刚安装了GSL。 我下载了最新的GSL版本,并在解压缩的文件夹中运行sudo make,然后sudo make install,然后simon@simon-bnt:~/Skrivbord/gsl-test$ gcc main.c -o main -lgsl -lgslcblas -lm /tmp/cclZjB9J.o: I funktionen "main": main.c:(.text+0xe): undefined reference to gsl_interp2d_bilinear main.c:(.text+0x88): undefined reference to gsl_spline2d_alloc main.c:(.text+0xbc): undefined reference to gsl_spline2d_set main.c:(.text+0xde): undefined reference to gsl_spline2d_set main.c:(.text+0x10e): undefined reference to gsl_spline2d_set main.c:(.text+0x130): undefined reference to gsl_spline2d_set main.c:(.text+0x156): undefined reference to gsl_spline2d_init main.c:(.text+0x26b): undefined reference to gsl_spline2d_eval main.c:(.text+0x308): undefined reference to gsl_spline2d_free collect2: error: ld returned 1 exit status 。 在安装过程中,一切似乎都运行良好。

我已经尝试了文档中的一些基本示例。 this页面中的第一个示例效果很好。

但是this示例不起作用。我收到以下错误:

simon@simon-bnt:~/Skrivbord/gsl-test$ gcc -o main main.c gsl-config --cflags --libs
simon@simon-bnt:~/Skrivbord/gsl-test$ ./main
./main: error while loading shared libraries: libgsl.so.19: 
cannot open shared object file: No such file or directory`

所以我用Google搜索了一段时间,找到了另一种方法来引用所需的库:

Makefile.config

但正如你所看到的那样也无效。 我希望能够将整个程序编译成可执行文件,所以我宁愿链接这些库。

我真的很高兴能得到所有帮助。

2 个答案:

答案 0 :(得分:1)

gsl-config命令打印要传递给编译器和/或链接器的参数。例如,在我的系统上:

$ gsl-config --cflags
-I/usr/include
$ gsl-config --libs
-L/usr/lib -lgsl -lgslcblas -lm
$ 

键入时:

gcc -o main main.c gsl-config --cflags --libs

您没有将gsl-config的输出传递给gcc,而是将*字符串“gsl-config传递给gcc,而gcc没有我不知道该怎么做。

我认为正确的命令行是这个,或者与它非常类似的东西:

gcc $(gsl-config --cflags) main.c -o main $(gsl-config --libs)

这假设您正在使用一些识别$(...)语法的sh派生shell。如果交互式shell是csh或tcsh,则可以使用:

gcc `gsl-config --cflags` main.c -o main `gsl-config --libs`

(你也可以在bash中使用反引号语法,但如果$(...)语法可用,我会发现libgsl*语法更容易使用。)

(顺便说一下,这对我不起作用,但我可能还没有安装一些必需的软件包。)

答案 1 :(得分:0)

我怀疑您的分发的libgsl0-dev个软件包会影响您的新安装。 2.0之前的GSL版本没有2d插值(IIRC),因此它将解释如何编译(使用新的标题)但不能链接。

删除root@ab45b54cd90e:/tmp# gcc -o gsl_interp2d gsl_interp2d.c -lgsl -lgslcblas -lm root@ab45b54cd90e:/tmp# ./gsl_interp2d | head 0.000000 0.000000 0.000000 0.000000 0.010101 0.010101 0.000000 0.020202 0.020202 0.000000 0.030303 0.030303 0.000000 0.040404 0.040404 0.000000 0.050505 0.050505 0.000000 0.060606 0.060606 0.000000 0.070707 0.070707 0.000000 0.080808 0.080808 0.000000 0.090909 0.090909 root@ab45b54cd90e:/tmp# 可能就足够了。然后,您仍然可以根据运行时运行Ubuntu软件包,但允许您针对本地gsl 2.0进行构建。

为了证明这一点,这里是使用 GSL 2.0 包在Debian测试容器中使用Docker会话进行复制和粘贴。然后一切正常:

apt-get update
apt-get install libgsl-dev
apt-get install build-essential      # for gcc and friends

我做了

import java.util.*;

public class GeneralNode<T>{

    private T data = null;
    private Vector<GeneralNode<T>> children = 
            new Vector<GeneralNode<T>>();

    public GeneralNode(){
        this(null);
    }

    public GeneralNode(T d){
        data = d;
    }

    public Vector<GeneralNode<T>> getChildren(){
        return children;
    }

    public void addChild(T d){
        GeneralNode<T> c = new GeneralNode<T>(d);
        this.children.add(c);
    }

    public void addChild(GeneralNode<T> c){
        this.children.add(c);
    }

    public T getData(){
        return data;
    }

    public void setData(T newData){
        data = newData;
    }

    public boolean isLeaf(){
        return(children.isEmpty());
    }

    public Vector getChildrenData(){
        Vector<T> result = new Vector<T>();
        for(int i = 0; i < children.size(); i++)
            result.add(children.elementAt(i).getData());
    return result;
    }
}

获取基本Docker容器之外的所需内容。