我正在尝试在我的MacBook Pro(13英寸,2012年中)的Montecarlo模拟上实现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>
错误:
fatal error: gsl/gsl_rng.h: No such file or directory
我的makefile中包含的编译标志:
INCLUDE = -I/usr/local/Cellar/gsl/2.4/include
LINK = -L/usr/local/Cellar/gsl/2.4/lib -lgsl -lgslcblas
我通过Homebrew安装了gcc-6和gsl。
如何让gcc-6找到gsl?我的旗子错了吗?
makefile:
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/Cellar/gsl/2.4/include/gsl/
的输出是:
/usr/local/Cellar/gsl/2.4/include/gsl/gsl_rng.h
ls /usr/local/Cellar/gsl/2.4/include/
的输出是:
gsl/
ls /usr/local/Cellar/gsl/2.4/include/gsl/
的输出太长而无法发布,但一切都在那里,应该如此。
附加信息: 我使用的是g ++ - 6而不是gcc-6,因为我最终要在其中执行模拟的集群需要代码符合C ++。
答案 0 :(得分:2)
在makefile中,你有(或者更准确地说,曾经声称拥有):
random.o: random.c
$(CC) -c random.c -lm -O3 $(CFLAGS)
编译目标文件时不应指定库。您的CFLAGS不包含${INCLUDE}
(或$(INCLUDE)
)宏。你需要这样的东西:
random.o: random.c
$(CC) -c random.c -O3 $(CFLAGS) $(INCLUDE)
这是一个微小的变化;我将$(INCLUDE)
添加到CFLAGS
(并再次删除-lm
- 你甚至不需要在Mac上使用它,尽管它没有特别的伤害)。我还要添加-Werror -Wmissing-prototypes -Wstrict-prototypes
,使用-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
,则可以做得更多。将它包含在“编译到对象”和“链接”阶段中。
(并且,详细地说,我有一堆单独的宏,以便每个标志可以独立打开或关闭,而不必重写整个CFLAGS。但是,这可以等待另一天。 )