4

无数个链接问题。我正在尝试构建一些调用 GNU 科学库的简单 C 代码。但是,GSL 文件夹没有嵌套在我的项目文件夹中。因此,例如,代码存在于C:/c-examples/GSL 库中C:/gsl

这是C代码

#include <stdio.h>
#include <gsl_math.h>
#include <fit/gsl_fit.h>

     int
     main (void)
     {
       int i, n = 4;
       double x[4] = { 1970, 1980, 1990, 2000 };
       double y[4] = {   12,   11,   14,   13 };
       double w[4] = {  0.1,  0.2,  0.3,  0.4 };

       double c0, c1, cov00, cov01, cov11, chisq;

       gsl_fit_wlinear (x, 1, w, 1, y, 1, n,
                        &c0, &c1, &cov00, &cov01, &cov11,
                        &chisq);

       printf ("# best fit: Y = %g + %g X\n", c0, c1);
       printf ("# covariance matrix:\n");
       printf ("# [ %g, %g\n#   %g, %g]\n",
               cov00, cov01, cov01, cov11);
       printf ("# chisq = %g\n", chisq);

       for (i = 0; i < n; i++)
         printf ("data: %g %g %g\n",
                        x[i], y[i], 1/sqrt(w[i]));

       printf ("\n");

       for (i = -30; i < 130; i++)
         {
           double xf = x[0] + (i/100.0) * (x[n-1] - x[0]);
           double yf, yf_err;

           gsl_fit_linear_est (xf,
                               c0, c1,
                               cov00, cov01, cov11,
                               &yf, &yf_err);

           printf ("fit: %g %g\n", xf, yf);
           printf ("hi : %g %g\n", xf, yf + yf_err);
           printf ("lo : %g %g\n", xf, yf - yf_err);
         }
       return 
}

这是我为它编写的makefile:

CC=gcc
CFLAGS=-Wall -IC:/gsl -lgsl
OLSexample: OLSexample.o 

clean:
    rm -f OLSexample OLSexample.o

但是,make在此退出时出现错误 2,找不到文件。我想我可能在 makefile 中指定依赖项或链接库时做错了。欢迎任何帮助。


编辑2:

按照 mux 的建议和此处的模板,我将 makefile 更改为以下内容(包括库的完整路径)。我继续得到以前的错误(e = 2)。

CC=gcc
CFLAGS=-c -Wall -IE:/programming/c/libraries/gsl-1.15.tar/gsl-1.15/
LDFLAGS= -LE:/programming/c/libraries/gsl-1.15.tar/gsl-1.15/
LIBS= -lgsl
SOURCES=OLSexample.c
OBJECTS=$(SOURCES:.c=.o)
EXECUTABLE=OLSexample

all: $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
    $(CC) $(LDFLAGS) $(OBJECTS) $(LIBS) -o $@

.c.o:
    $(CC) $(CFLAGS) $< -o $@

此处包含完整的错误消息以供参考:

e:\programming\c\WorkingFolder\gslExamples\1-ols>make
make
gcc -c -Wall -IE:/programming/c/libraries/gsl-1.15.tar/gsl-1.15/   -c -o OLSexample.o OLSexample.c
process_begin: CreateProcess((null), gcc -c -Wall -IE:/programming/c/libraries/gsl-1.15.tar/gsl-1.15/ -c -o OLSexample.o OLSexample.c, ...) failed.
make (e=2): The system cannot find the file specified.
make: *** [OLSexample.o] Error 2
4

3 回答 3

4

您应该添加-LC:/gsl到搜索目录列表,-I添加一个包含目录以搜索标题,并-L添加一个目录以搜索库-l<lib>。但是,我没有看到您实际编译任何东西,也许您应该从 Makefile 模板开始:

CC=gcc
CFLAGS=-c -Wall -Ic:/gsl
LDFLAGS= -Lc:/gsl
LIBS= -lgsl
SOURCES=main.c
OBJECTS=$(SOURCES:.c=.o)
EXECUTABLE=hello

all: $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
    $(CC) $(LDFLAGS) $(OBJECTS) $(LIBS) -o $@

.c.o:
    $(CC) $(CFLAGS) $< -o $@
于 2012-10-19T06:17:44.137 回答
2

您最近的错误表明 GNU make 在运行命令时遇到问题。在 Windows 中,它使用 CreateProcess 函数,但该函数失败了。这与gsl无关了。gcc 在你的路上吗?如果你只输入 gcc 而不是 make,你会得到什么?

于 2012-10-19T07:24:59.587 回答
1

好的,所以我弄清楚了问题所在。原来我有另一个版本,正如在这个线程上make讨论的那样。

于 2012-10-19T13:28:01.033 回答