无法在Mac上使用gsl进行编译

无法在Mac上使用gsl进行编译,c,macos,gcc,gsl,gcc6,C,Macos,Gcc,Gsl,Gcc6,我正试图在我的MacBookPro(13英寸,2012年年中)上的蒙特卡洛模拟上实现gsl_rng.h。模拟都是用C语言编写的。我的问题是gcc-6抱怨它找不到gsl库,尽管我认为编译标志很好 declare.h的顶部,它包含在我正在处理的所有.c文件中: /* __________________ LIBRARIES ___________________*/ #include <stdio.h> #include <stdlib.h> #include <mat

我正试图在我的MacBookPro(13英寸,2012年年中)上的蒙特卡洛模拟上实现gsl_rng.h。模拟都是用C语言编写的。我的问题是gcc-6抱怨它找不到gsl库,尽管我认为编译标志很好

declare.h的顶部,它包含在我正在处理的所有.c文件中:

/* __________________ LIBRARIES ___________________*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <gsl/gsl_rng.h>
my makefile中包含的编译标志:

INCLUDE = -I/usr/local/Cellar/gsl/2.4/include
LINK = -L/usr/local/Cellar/gsl/2.4/lib -lgsl -lgslcblas
CC = g++-6

CFLAGS = -lm -O3 -ansi -pedantic -Wall -Wextra\
        -Wconversion -Wredundant-decls -fmax-errors=7\
        -Wunsafe-loop-optimizations -Wmissing-braces\
        -Wparentheses
        # -Wdouble-promotion

INCLUDE = -I/usr/local/Cellar/gsl/2.4/include

LINK = -L/usr/local/Cellar/gsl/2.4/lib -lgsl -lgslcblas

../bin/bidimensional_MC: random.o functions.o subroutines.o\
             main.o 
$(CC) -o ../bin/bidimensional_MC random.o functions.o\
      subroutines.o main.o  $(CFLAGS) $(LINK) $(INLCUDE)

random.o: random.c
    $(CC) -c random.c -lm -O3  $(CFLAGS) $(INCLUDE)

functions.o: functions.c
    $(CC) -c functions.c  $(CFLAGS) $(INCLUDE)

main.o: main.c
    $(CC) -c main.c  $(CFLAGS) $(INCLUDE)

suboutines.o: subroutines.c
    $(CC) -c subroutines.c  $(CFLAGS) $(INCLUDE)

clean:
    rm *.o
我通过自制安装了gcc-6和gsl

如何让gcc-6找到gsl?我的旗子错了吗

生成文件:

INCLUDE = -I/usr/local/Cellar/gsl/2.4/include
LINK = -L/usr/local/Cellar/gsl/2.4/lib -lgsl -lgslcblas
CC = g++-6

CFLAGS = -lm -O3 -ansi -pedantic -Wall -Wextra\
        -Wconversion -Wredundant-decls -fmax-errors=7\
        -Wunsafe-loop-optimizations -Wmissing-braces\
        -Wparentheses
        # -Wdouble-promotion

INCLUDE = -I/usr/local/Cellar/gsl/2.4/include

LINK = -L/usr/local/Cellar/gsl/2.4/lib -lgsl -lgslcblas

../bin/bidimensional_MC: random.o functions.o subroutines.o\
             main.o 
$(CC) -o ../bin/bidimensional_MC random.o functions.o\
      subroutines.o main.o  $(CFLAGS) $(LINK) $(INLCUDE)

random.o: random.c
    $(CC) -c random.c -lm -O3  $(CFLAGS) $(INCLUDE)

functions.o: functions.c
    $(CC) -c functions.c  $(CFLAGS) $(INCLUDE)

main.o: main.c
    $(CC) -c main.c  $(CFLAGS) $(INCLUDE)

suboutines.o: subroutines.c
    $(CC) -c subroutines.c  $(CFLAGS) $(INCLUDE)

clean:
    rm *.o
ls/usr/local/ceral/gsl/2.4/include/gsl/
的输出为:

/usr/local/Cellar/gsl/2.4/include/gsl/gsl_rng.h
gsl/ 
ls/usr/local/ceral/gsl/2.4/include/
的输出为:

/usr/local/Cellar/gsl/2.4/include/gsl/gsl_rng.h
gsl/ 
ls/usr/local/ceral/gsl/2.4/include/gsl/的输出太长,无法发布,但一切都在那里,这是应该的

额外资料: 我使用G+-6而不是GCC-6,因为我要最终执行模拟的集群需要代码兼容C++。在/MUP文件中,

,您(或者,更确切地说,一次声称拥有):

编译对象文件时不应指定库。您的cflag不包括
${include}
(或
$(include)
)宏。你需要像这样的东西:

random.o: random.c
    $(CC) -c random.c -O3 $(CFLAGS) $(INCLUDE)
这是一个微小的变化;我会将
$(INCLUDE)
添加到
CFLAGS
(并再次删除
-lm
——你甚至不需要在Mac电脑上使用它,尽管它没有特定的危害)。我还要添加
-Werror-Wmissing prototype-Wstrict prototype
,使用
-ansi
(又称
-std=c90
)是不明智的——这是一个过时的标准。您应该使用
-std=c11

CFLAGS = -O3 -g -std=c11 -pedantic -Wall -Wextra \
        -Wconversion -Wredundant-decls -fmax-errors=7 \
        -Wunsafe-loop-optimizations -Wmissing-braces \
        -Wparentheses $(INCLUDE) \
        -Werror -Wmissing-prototypes -Wstrict-prototypes
此外,我还添加了
-g
以获取调试代码。始终包括
-g
,即使进行了优化。它没有运行时成本;如果需要调试代码,它确实有好处。诚然,调试优化的代码并不容易,但是如果没有
-g
,您可以做得更多。将其包括在“编译到对象”和“链接”阶段

(详细地说,我会有一堆单独的宏,这样每个标志都可以独立打开或关闭,而不必重写整个CFLAG。不过,这可以再等一天。)

在makefile中,您有(或者更准确地说,曾经声称有):

编译对象文件时不应指定库。您的cflag不包括
${include}
(或
$(include)
)宏。你需要像这样的东西:

random.o: random.c
    $(CC) -c random.c -O3 $(CFLAGS) $(INCLUDE)
这是一个微小的变化;我会将
$(INCLUDE)
添加到
CFLAGS
(并再次删除
-lm
——你甚至不需要在Mac电脑上使用它,尽管它没有特定的危害)。我还要添加
-Werror-Wmissing prototype-Wstrict prototype
,使用
-ansi
(又称
-std=c90
)是不明智的——这是一个过时的标准。您应该使用
-std=c11

CFLAGS = -O3 -g -std=c11 -pedantic -Wall -Wextra \
        -Wconversion -Wredundant-decls -fmax-errors=7 \
        -Wunsafe-loop-optimizations -Wmissing-braces \
        -Wparentheses $(INCLUDE) \
        -Werror -Wmissing-prototypes -Wstrict-prototypes
此外,我还添加了
-g
以获取调试代码。始终包括
-g
,即使进行了优化。它没有运行时成本;如果需要调试代码,它确实有好处。诚然,调试优化的代码并不容易,但是如果没有
-g
,您可以做得更多。将其包括在“编译到对象”和“链接”阶段



(详细地说,我会有一堆单独的宏,这样每个标志都可以独立打开或关闭,而不必重写整个CFLAG。不过,这可以再等一天。)

是否为有效目录?include路径和lib路径有效吗?
ls/usr/local/ceral/gsl/2.4/include/gsl/gsl\rng.h/usr/local/ceral/gsl/2.4/include/gsl//usr/local/ceral/gsl/2.4/include/
的输出是什么?@retiredInja它们是存储所有内容的绝对路径。也许您希望看到这样的内容:
/usr/local/include
,但它只包含指向我以前编写的路径的符号链接;规则中是否使用了它们?执行的命令是什么?如有必要,使用
make-n
查找-您需要查看并报告GCC的调用。@maganadev good。然后我怀疑您的makefile没有使用编译标志。因此,发布makefile的MCVE…/证明
-I
实际上是给gcc的。(就像乔纳森所说的那样)
/usr/local/ceral/gsl/2.4
是有效的目录吗?include路径和lib路径有效吗?
ls/usr/local/ceral/gsl/2.4/include/gsl/gsl\rng.h/usr/local/ceral/gsl/2.4/include/gsl//usr/local/ceral/gsl/2.4/include/
的输出是什么?@retiredInja它们是存储所有内容的绝对路径。也许您希望看到这样的内容:
/usr/local/include
,但它只包含指向我以前编写的路径的符号链接;规则中是否使用了它们?执行的命令是什么?如有必要,使用
make-n
查找-您需要查看并报告GCC的调用。@maganadev good。然后我怀疑您的makefile没有使用编译标志。因此,发布makefile的MCVE…/证明
-I
实际上是给gcc的。(就像乔纳森说的那样)为什么
ansi
?!只要推荐
-std=c11
或者至少99,这个程序毕竟是在Mac上运行的;)谢谢@JonathanLeffler,这终于成功了。我用更合适的编译标志更新了答案。我不确定我是否会使用
-wparenteses
-Wmissing大括号
-默认情况下我不会使用它们。剩下的就不用担心了。@AnttiHaapala,因为模拟完成后将在其中运行的集群。在任何其他程序上,我也会使用
-std=c11
。非常感谢您的反馈