通过make将GSL链接到C

4

第n个链接问题。我正在尝试编写一些简单的C代码来调用GNU科学库。但是,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

没错,我意识到了这一点,并且删除了所有的\t和\n。现在我又回到了起点。关于这个链接过程,有些东西我就是搞不明白。 - tchakravarty
1
首先,那不是完整的Makefile,你缺少了最后一部分;其次,现在你在链接目标文件时使用LDFLAGS,应该将任何链接器标志添加到名为LDFLAGS的变量中,并且库应该放在$(OBJECTS)之后。 - iabdalkader
我已更新我的 makefile,以考虑您最新的建议。您能否确认您能够编译此示例? - tchakravarty
我的确尝试过,但对我没有起作用(出现了相同的错误信息),所以我在想我是不是链接到了错误的 GSL 目录(我链接到的是绝对顶层目录,而不是任何包含目录)。我还担心我的代码中的 include 指令,在主要问题中已经进行了更新。 - tchakravarty
看起来 OLSexample.c 文件丢失了。 - iabdalkader
显示剩余2条评论
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 $@

好的,所以我使用了错误的开关“-I”而不是“-L”。感谢您的纠正。我仍然遇到e=2错误——系统找不到指定的文件。 - tchakravarty
Mux,我按照你的建议添加了问题。但我仍然得到相同的错误提示,你能看一下吗? - tchakravarty
你为什么在CFLAGS中添加了“-c”?这个标志应该在编译“.c”文件为“.o”文件时使用,而不是每次编译都使用。此外,通常最好不要定义这种转换的规则,而是使用内置规则。 - HonkyTonk
这正是它存在的原因,多个文件被单独编译,然后链接起来,我不明白问题出在哪里? - iabdalkader

2

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


谢谢David。我正在64位Windows上使用MinGW,bin的路径已经被加入到全局环境变量中: e:\programming\c\WorkingFolder\gslExamples\1-ols>gcc gcc gcc致命错误:没有输入文件 编译终止。 - tchakravarty
此外: e:\programming\c\WorkingFolder\gslExamples\1-ols>gcc -Wall OLSexample.c gcc -Wall OLSexample.c OLSexample.c:2:22: 致命错误:gsl_math.h:没有那个文件或目录 编译终止。 - tchakravarty

1

好的,我找到了问题所在。原来我有另一个版本的make,就像在这个帖子中讨论的那样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接