【问题标题】:Unable to compile with gsl on Mac无法在 Mac 上使用 gsl 编译
【发布时间】:2017-09-18 04:53:13
【问题描述】:

我正在尝试在我的 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++。

【问题讨论】:

  • /usr/local/Cellar/gsl/2.4 是一个有效的目录吗?包含路径和库路径是否有效?
  • ls /usr/local/Cellar/gsl/2.4/include/gsl/gsl_rng.h /usr/local/Cellar/gsl/2.4/include/gsl/ /usr/local/Cellar/gsl/2.4/include/ 的输出是什么?
  • @RetiredNinja 它们是存储所有内容的绝对路径。也许您期望类似:/usr/local/include 但它只包含指向我之前编写的路径的符号链接。
  • 您在 makefile 中包含了一些标志;它们在规则中使用吗?执行的命令是什么?如有必要,请使用make -n 查找 - 您需要查看并报告 GCC 的调用。
  • @MagannaDev 好。然后我怀疑你的makefile没有使用编译标志。因此发布你的makefile的MCVE ... /证明-I实际上是给gcc的。 (就像乔纳森说的)

标签: c macos gcc gsl gcc6


【解决方案1】:

在 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。但是,这可以等待另一天。 )

【讨论】:

  • 为什么是ansi?!只推荐-std=c11或至少99,这个程序毕竟在Mac上运行;)
  • 谢谢@JonathanLeffler,终于成功了。
  • 我已经用更合适的编译标志更新了答案。我不确定我会使用-Wparentheses 还是-Wmissing-braces——我默认不使用它们。其余的不用我担心。
  • @AnttiHaapala,因为模拟完成后将在其中运行的集群。在任何其他程序上,我也会使用 -std=c11 。非常感谢您的反馈和耐心。
猜你喜欢
  • 1970-01-01
  • 2011-08-20
  • 2012-02-27
  • 1970-01-01
  • 2020-07-06
  • 2023-04-06
  • 1970-01-01
  • 2017-08-25
  • 1970-01-01
相关资源
最近更新 更多