以下列方式编译特定代码没有问题:
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
答案 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。
答案 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)
这可能是......