如何在makefile中加入-I

时间:2009-04-07 03:58:30

标签: c++ boost 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 $@

Code2: Code2.cc Tools.cc
    $(CXX)   $^ -o $@

Code1: Code1.cc Tools.cc
    $(CXX) -I /opt/local/include $^ -o $@

抱怨道。这样做的正确方法是什么? 请注意,只有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

5 个答案:

答案 0 :(得分: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 $@

Code2: Code2.cc Tools.cc
        $(CXX) $(CXXFLAGS) $^ -o $@

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

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

Code1: Code1.cc Tools.cc
        $(CXX) $(CXXFLAGS) $^ -o $@

请注意,您可能还希望切换到使用模式规则,而不是明确声明所有(非常相似)目标的规则。例如,您可以使用以下代码替换Code1,Code2和Code3规则:

%: %.cc Tools.cc
        $(CXX) $(CXXFLAGS) $^ -o $@

编辑:响应有关特定错误的更新帖子:看起来您可能会被烧毁,因为在使用Makefile时在标志中包含-Wall -Werror,但不是在命令行上。 -Wall导致g ++对语法更加挑剔; -Werror导致g ++推广通常只是警告成全面错误的东西。由于错误是针对第三方库中的代码报告的,因此您可以使用不太严格的警告选项(即删除-Wall);或者你可能需要切换到一个更新版本的编译器,它可以处理构造而不会抱怨;或者你可能只需要明确指定-std=c99来提醒编译器你想要C99支持。

希望有所帮助,

Eric Melski

答案 1 :(得分:4)

-pedantic会导致报告所有必需的警告,并且-Werror会将警告报告为错误。由于C ++没有定义“ULL”长整型常量语法(C99),因此可能会报告此情况,然后通过g ++将其提升为完全错误状态。

尝试删除-pedantic。

Or try #including <boost/cstdint.hpp>.

答案 2 :(得分:1)

了解投诉内容会很有帮助 - 但请尝试取出-I/opt/local/include之间的空格:

 -I/opt/local/include $^ -o $@

答案 3 :(得分:1)

如果你正在使用GNU make,你可能会考虑这样的结构:

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

等...

答案 4 :(得分: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) -o$@ $(OBJECTS) $(LIBS)

这可能是......