当我知道引用是正确的时,gcc未定义引用

当我知道引用是正确的时,gcc未定义引用,c,gcc,archlinux,C,Gcc,Archlinux,我有这个简单的C程序,但就是不能正确链接它 这是节目, #include <gsl/gsl_cdf.h> #include <stdio.h> int main() { double bottom_tail = gsl_cdf_gaussian_P(-1.96, 1); printf("Area between [-1.96, 1.96]: %g\n", 1-2*bottom_tail); } 我确信gsl\u cdf.h头文件在/usr/local/in

我有这个简单的C程序,但就是不能正确链接它

这是节目,

#include <gsl/gsl_cdf.h>
#include <stdio.h>

int main()
{
   double bottom_tail = gsl_cdf_gaussian_P(-1.96, 1);
   printf("Area between [-1.96, 1.96]: %g\n", 1-2*bottom_tail);
}
我确信
gsl\u cdf.h
头文件在
/usr/local/include/gsl
中,同样地,我知道
。因此
/usr/local/lib

链接器gcc backend?抱怨我对
gsl\u cdf\u gaussian\u p

我认为我的订单不正确,因此我也尝试:

gcc-I/usr/local/include/gsl-L/usr/local/lib gsl\u erf.c-o gslTest


但这也很糟糕。我做错了什么(

您实际上没有在compile命令上请求库。您提供了一个带有“-L”的搜索路径,但实际上没有请求库。您还需要类似“-lgsl”的东西(假设库是libgsl.so).

您必须告诉编译器实际链接到您正在使用的库:您需要一个
-l
选项,可能类似于
-lgsl
(取
.so
文件的名称,删除
.so
后缀和
lib
前缀,这就是在
-l
之后放置的内容)


-L
选项告诉链接器在哪里可以找到库,但并不指导它实际链接到任何东西-就像
-I
选项告诉编译器在哪里可以找到头,但实际上不包含任何代码。

您的问题是,未定义的引用是
gel\u cdf\u gaussian\u p
。这是问题中的一个输入错误,还是链接器消息实际上指的是“凝胶”而不是“gsl”?不,这是一个输入错误,已修复。gsl\u cdf\u Gaussian\u P?哈,我甚至没有注意到这一部分。:-)好吧,我想我现在知道了所有的输入错误。谢谢,但现在我得到了更多未定义的引用,各种各样的CBLA。但我想这可能是因为我没有安装blas。编辑:刚刚安装了blas,但仍有这些未定义的引用。编辑#2:只需在gnu页面上查找gls,就可以发现,
该库易于编译,并且不依赖于其他软件包。
因此,我认为如果没有安装blas,这并不重要。看起来您还需要
-lgslcblas
。它附带了GSL(至少在我刚刚尝试的Debian包中是这样)。我对GSL不是很熟悉,但听上去好像他们把CBLAS放在一个单独的库中,这样你就可以选择链接不同的BLAS实现了。好的,我现在做了
gcc-I/usr/local/include/GSL-L/usr/local/lib-gel\erf.c-o gslTest-lgsl-lgslcblas
,这是编译好的,但是在运行可执行文件时,我在加载共享库时遇到了一个错误,
libgsl.so.0
,我知道它存在于
/usr/local/lib/
中,听起来好像
/usr/local/lib
不在动态链接器的搜索路径上,尽管我很惊讶这种情况,因为大多数系统默认都有它。运行程序时,请尝试设置
LD\u LIBRARY\u PATH=/usr/local/lib
。Arch具有。如果您安装了它,那么文件将位于
/usr/include
/usr/lib
中,因此您不需要
-I
-L
LD\u库路径
。(此外,您还可以享受软件包的所有其他好处,如自动升级。)
gcc gsl_erf.c -o gslTest -I/usr/local/include/gsl -L/usr/local/lib