2009-04-07 2 views
1

У меня нет никаких проблем с компиляцией конкретного кода следующим образом:Howto включают -I в Makefile

g++ -I /opt/local/include Code1.cc -o Code1 

Однако, когда я попытался сделать это в Makefile:

CXX = g++ -Wall -Werror -gstabs -pedantic -O2 -g 

all: Code3 Code2 Code1 


Code3: Code3.cc Tools.cc 
    $(CXX) $^ -o [email protected] 

Code2: Code2.cc Tools.cc 
    $(CXX) $^ -o [email protected] 

Code1: Code1.cc Tools.cc 
    $(CXX) -I /opt/local/include $^ -o [email protected] 

Он жалуется. Каков правильный способ сделать это? Обратите внимание, что только Code1.cc требует, чтобы внешняя библиотека была включена.

Заголовок Code1.cc выглядит следующим образом:

#include <iostream>  
#include <vector>   
#include <fstream>  
#include <sstream>  
#include <iomanip>  
#include <boost/math/distributions/chi_squared.hpp> 
using namespace std;  
using boost::math::chi_squared; 
using boost::math::quantile; 

Я получаю ошибку следующим образом:

g++ -Wall -Werror -gstabs -pedantic -O2 -g -I/opt/local/include Code1.cc Tools.cc -o EstimateErrorMean 
In file included from /opt/local/include/boost/detail/lcast_precision.hpp:16, 
       from /opt/local/include/boost/lexical_cast.hpp:31, 
       from /opt/local/include/boost/math/special_functions/gamma.hpp:23, 
       from /opt/local/include/boost/math/distributions/chi_squared.hpp:13, 
       from EstimateErrorMean.cc:19: 
/opt/local/include/boost/integer_traits.hpp:164:66: error: use of C99 long long integer constant 
/opt/local/include/boost/integer_traits.hpp:164:77: error: use of C99 long long integer constant 
/opt/local/include/boost/integer_traits.hpp:170:70: error: use of C99 long long integer constant 

ответ

4

-pedantic вызывает все необходимые предупреждения сообщать, и -Werror вызывает предупреждений сообщаться как ошибки. Поскольку C++ не определяет длинный длинный целочисленный синтаксис «ULL» (C99), это, вероятно, сообщается, а затем повышается до полного состояния ошибки g ++.

Попробуйте удалить -pedantic.

+0

@rkb: удаление педантичных произведений, но не #include neversaint

1

Было бы полезно знать, что жалоба - но попробовать вынимая пространство между -I и /opt/local/include:

-I/opt/local/include $^ -o [email protected] 
+0

@Dan: Я все еще получаю ту же ошибку после удаления пространства. Я обновил OP с сообщением об ошибке. – neversaint

+0

Я видел это. Я думаю, что Эрик Мельски на правильном пути, но и попытаться вырваться из -эпицентра - я думаю, что это *, где проблема. –

+0

Или предложение rkb: «Или попробуйте #including ». Это должно оставаться счастливым, по крайней мере, в этом случае. –

1

Если вы используете GNU, чтобы вы могли бы рассмотреть структуру как:

CXXFLAGS += -Wall -Werror -gstabs -pedantic -O2 -g 
CXXFLGAS += -I/opt/local/include 

SRCS:=Code1.cc Code2.cc Code3.cc 
OBJS:=$(subst .cc,.o,$(SRCS)) 
EXES:=$(subst .o,,$(OBJS)) 

all: $(EXES) 

где вы рассчитывать на встроенном в правиле для управления компиляцией из .cc файлов .o файлов в исполняемые файлы.

Обратите внимание, что вы можете также определить компоновщика флаги

LDFLAGS:=-g 

и тому подобное ...

5

В GNU Make Makefile, соглашение заключается в использовании CXXFLAGS для флагов компилятора C++, и чтобы сделать дополнение к флагам для конкретной цели, вы можете использовать целевые переменные. Например:

CXX=g++ 

# Set CXXFLAGS to include the base set of flags 

CXXFLAGS=-Wall -Werror -gstabs -pedantic -O2 -g 

all: Code3 Code2 Code1 

Code3: Code3.cc Tools.cc 
     $(CXX) $(CXXFLAGS) $^ -o [email protected] 

Code2: Code2.cc Tools.cc 
     $(CXX) $(CXXFLAGS) $^ -o [email protected] 

# Add a target-specific addition to CXXFLAGS for Code1: 

Code1: CXXFLAGS += -I/opt/local/include 

Code1: Code1.cc Tools.cc 
     $(CXX) $(CXXFLAGS) $^ -o [email protected] 

Обратите внимание, что вы также можете переключиться на использование шаблонных правил, а не явно объявить правила для всех (очень похожих) целей. Например, вы могли бы заменить правила Code1, Кодекса2 и Code3 только с этим:

%: %.cc Tools.cc 
     $(CXX) $(CXXFLAGS) $^ -o [email protected] 

EDIT: В ответ на обновленный пост о конкретной ошибке видели: он выглядит, как вы, вероятно, обжечься, потому что вы включите -Wall -Werror во флагах, когда вы используете Makefile, но не в командной строке. -Wall заставляет g ++ быть более придирчивым в отношении синтаксиса; -Werror заставляет g ++ продвигать вещи, которые обычно являются просто предупреждениями, в полномасштабные ошибки. Поскольку ошибки сообщаются с кодом в сторонней библиотеке, возможно, вы можете обойтись с менее строгими параметрами предупреждения (т. Е. Удалить -Wall); или, возможно, вам нужно переключиться на более новую версию компилятора, которая может обрабатывать конструкции без жалоб; или вам просто нужно явно указать -std=c99, чтобы предупредить компилятор о необходимости поддержки C99.

Надежда, что помогает,

Эрик Melski

+0

@Erik: Я все равно получаю ту же ошибку. Я обновил OP с сообщением об ошибке. – neversaint

+0

@foolishbrat: см. Мой обновленный ответ. –

+0

Попытайтесь вырваться из-абхазской тоже. На странице man: «-pedantic ... отклонить все программы, которые используют запрещенные расширения». –

1
INCLUDE_PATH = -I/opt/local/include 
LINK_PATH = -L <Library paths> 
LIBS = -l<libraryname> 

OBJECTS = Code1.o\ 
      Code2.o\ 
      Code3.o\ 

CXXFLAGS += $(INCLUDE_PATH) 

Code1 : $(OBJECTS) 
      $(CXX) $(LINK_PATH) [email protected] $(OBJECTS) $(LIBS) 

Это может работать ...

Смежные вопросы