2017-09-18 5 views
-1

J'essaie d'implémenter gsl_rng.h sur une simulation Montecarlo sur mon MacBook Pro (13 pouces, mi 2012). La simulation est tout écrite en C. Mon problème est que gcc-6 se plaint de ne pas trouver la bibliothèque gsl malgré les drapeaux de compilation qui, je pense, vont bien.Impossible de compiler avec gsl sur Mac

Le sommet de declare.h, qui est inclus dans tous les fichiers .c Je travaille sur:

/* __________________ LIBRARIES ___________________*/ 
#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include <time.h> 
#include <gsl/gsl_rng.h> 

L'erreur:

fatal error: gsl/gsl_rng.h: No such file or directory 

Les drapeaux de compilation inclus dans mon makefile:

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

J'ai installé à la fois gcc-6 et gsl via Homebrew.

Comment puis-je trouver gcc-6 à trouver gsl? Mes drapeaux sont-ils faux?

Le 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 

La sortie de ls /usr/local/Cellar/gsl/2.4/include/gsl/ est:

/usr/local/Cellar/gsl/2.4/include/gsl/gsl_rng.h 

La sortie de ls /usr/local/Cellar/gsl/2.4/include/ est:

gsl/ 

La sortie de ls /usr/local/Cellar/gsl/2.4/include/gsl/ est trop long pour poster, mais tout est là, comme il se doit. J'utilise g ++ - 6 au lieu de gcc-6 parce que le cluster dans lequel je vais enfin exécuter la simulation nécessite que le code soit conforme à C++.

+2

est/usr/local/Cellar/gsl/2.4' un répertoire valide? Le chemin include et le chemin lib sont-ils valides? –

+1

Quelle est la sortie de '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/inclure/'? –

+0

@RetiredNinja Ce sont les chemins absolus où tout est stocké. Peut-être vous attendiez quelque chose comme: '/ usr/local/include' mais cela ne contient que des liens symboliques vers les chemins que j'ai précédemment écrits. –

Répondre

1

Dans le makefile, vous avez (ou, plus précisément, à un moment prétendu avoir):

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

Vous ne devez pas spécifier la bibliothèque lors de la compilation du fichier objet. Votre CFLAGS n'inclut pas la macro ${INCLUDE} (ou $(INCLUDE)). Vous avez besoin de quelque chose comme:

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

Ceci est un changement minimal; J'ajouterais $(INCLUDE) à CFLAGS (et enlèverai le -lm encore - vous n'avez même pas besoin de cela sur un Mac bien qu'il ne fasse aucun mal spécifique). Je voudrais également ajouter -Werror -Wmissing-prototypes -Wstrict-prototypes, et en utilisant -ansi (aka -std=c90) n'est pas sensible - c'est un standard archaïque. Vous devriez utiliser -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 

Aussi, j'ai ajouté -g pour obtenir le code de débogage. Toujours inclure -g, même avec optimisation. Il n'a pas de coût d'exécution; il a un avantage si vous avez besoin de déboguer le code. Certes, il n'est pas aussi facile de déboguer le code optimisé, mais vous pouvez faire plus que si vous n'avez pas -g. Incluez-le à la fois dans les phases «compilation à objet» et «liaison».

(Et, en détail, j'aurais un tas de macros séparées de sorte que chaque drapeau puisse être activé ou désactivé indépendamment, plutôt que d'avoir à réécrire l'ensemble des CFLAGS.Cependant, cela peut attendre un autre jour.)

+0

pourquoi 'ansi' ?! il suffit de recommander «-std = c11» ou au moins 99, ce programme fonctionne sur Mac après tout;) –

+0

Merci @JonathanLeffler, cela a finalement fait fonctionner. –

+0

J'ai mis à jour la réponse avec des drapeaux de compilation plus appropriés. Je ne suis pas sûr d'utiliser '-Wparentheses' ou' -Wmissing-braces' - je ne les utilise pas par défaut. Le reste ne me cause pas d'inquiétude. –