GNU 科学图书馆对 xx 问题的未定义引用
GNU Scientific Library undefined reference to xx issue
我正在为 GSL 苦苦挣扎,我在 Ubuntu 14.04 上并且刚刚安装了 GSL。
我下载了最新的 GSL 版本,然后在解压缩的文件夹中 运行 ./configure
,然后是 sudo make
,然后是 sudo make install
。
安装期间似乎一切正常。
我尝试了文档中的一些基本示例。 this 页面中的第一个示例效果很好。
但是this示例不起作用。我收到以下错误:
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
所以我在谷歌上搜索了一段时间,找到了另一种引用所需库的方法:
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`
但是如您所见,这也不起作用。
我希望能够将整个程序编译成一个可执行文件,所以我宁愿 link 库。
如果能得到所有帮助,我会非常高兴。
gsl-config
命令打印要传递给编译器 and/or 链接器的参数。例如,在我的系统上:
$ 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
,而是将 *string" 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*
发行版的软件包隐藏了您的新安装。 2.0 之前的 GSL 版本没有二维插值 (IIRC),因此它会解释如何编译(使用新的 headers)而不是 link。
删除 libgsl0-dev
可能就足够了。然后,您仍然可以 运行 反对 Ubuntu 软件包,具体取决于 run-time 但允许您针对本地 gsl 2.0.
进行构建
为了证明这一点,这里是使用 GSL 2.0 包从 Debian 测试容器中的 Docker session 复制和粘贴。然后一切正常:
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#
我做到了
apt-get update
apt-get install libgsl-dev
apt-get install build-essential # for gcc and friends
获得超出基本 Docker 容器所需的内容。
我正在为 GSL 苦苦挣扎,我在 Ubuntu 14.04 上并且刚刚安装了 GSL。
我下载了最新的 GSL 版本,然后在解压缩的文件夹中 运行 ./configure
,然后是 sudo make
,然后是 sudo make install
。
安装期间似乎一切正常。
我尝试了文档中的一些基本示例。 this 页面中的第一个示例效果很好。
但是this示例不起作用。我收到以下错误:
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
所以我在谷歌上搜索了一段时间,找到了另一种引用所需库的方法:
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`
但是如您所见,这也不起作用。 我希望能够将整个程序编译成一个可执行文件,所以我宁愿 link 库。
如果能得到所有帮助,我会非常高兴。
gsl-config
命令打印要传递给编译器 and/or 链接器的参数。例如,在我的系统上:
$ 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
,而是将 *string" 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*
发行版的软件包隐藏了您的新安装。 2.0 之前的 GSL 版本没有二维插值 (IIRC),因此它会解释如何编译(使用新的 headers)而不是 link。
删除 libgsl0-dev
可能就足够了。然后,您仍然可以 运行 反对 Ubuntu 软件包,具体取决于 run-time 但允许您针对本地 gsl 2.0.
为了证明这一点,这里是使用 GSL 2.0 包从 Debian 测试容器中的 Docker session 复制和粘贴。然后一切正常:
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#
我做到了
apt-get update
apt-get install libgsl-dev
apt-get install build-essential # for gcc and friends
获得超出基本 Docker 容器所需的内容。