gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:01:38 25 4
gpt4 key购买 nike

我正在尝试在我的 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?我的标志错了吗?

生成文件:

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++。

最佳答案

在 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) t 明智——这是一个古老的标准。您应该使用 -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。但是,这可以等到另一天。 )

关于c - 无法在 Mac 上使用 gsl 进行编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46271832/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com