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)
在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支持.
希望有所帮助,
埃里克·梅尔斯基