如何在makefile中合并-I

nev*_*int 1 c++ boost makefile

我通过以下方式编译特定代码没有问题:

g++ -I /opt/local/include Code1.cc -o Code1
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试在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 $@
Run Code Online (Sandbox Code Playgroud)

它抱怨.这样做的正确方法是什么?请注意,只有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;
Run Code Online (Sandbox Code Playgroud)

我得到的错误如下:

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
Run Code Online (Sandbox Code Playgroud)

Eri*_*ski 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 $@
Run Code Online (Sandbox Code Playgroud)

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

%: %.cc Tools.cc
        $(CXX) $(CXXFLAGS) $^ -o $@
Run Code Online (Sandbox Code Playgroud)

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

希望有所帮助,

埃里克·梅尔斯基