我尝试了this answer中的建议,但这是针对GCC的,无论如何也无济于事。
我想在文件中添加#include <thread>
,因此我有一个make文件,如下所示:
OBJS = clitest.o Sources/NClient.o
CC = g++
DEBUG = -g
CFLAGS = -Wall -c $(DEBUG)
LFLAGS = -Wall $(DEBUG)
clitest: $(OBJS)
$(CC) $(LFLAGS) $(OBJS) -o clitest
我应该在哪里在其中包括
-std=c++11
和-lpthread
?我已经尝试了几乎所有可能的组合,但是当我运行
make
时,我仍然遇到此错误:/usr/include/c++/4.8.3/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support is currently experimental, and must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
我相信这是它正在运行的命令吗?
[jaska@localhost NClient]make
g++ -c -o clitest.o clitest.cpp
这也是源代码文件:
#include <thread>
#include <string>
void task(std::string msg){
std::cout << msg << '\n';
}
...
...
std::thread t1(task, "message");
client->create();
t1.join();
最佳答案
您的makefile没有使用$(OBJS)
编译对象的显式规则,因此这意味着将使用隐式规则,这就是产生此命令的原因:
g++ -c -o clitest.o clitest.cpp
将
.cpp
文件转换为.o
文件的隐式规则大约是:$(CXX) $(CXXFLAGS) -c -o $@ $<
因此,要添加影响该规则的选项,应将其添加到
CXXFLAGS
变量(CFLAGS
通常用于编译C文件,而CC
是C编译器,C++编译器的常规变量是CXX
)。-lpthread
选项是一个链接器选项,因此需要在链接过程中给出。您已经定义了自己的链接规则,因此您应该在该配方中添加-lpthread
或将其添加到LFLAGS
变量。N.B.在链接期间使用
-Wall
和-g
是没有用的,它们没有效果。N.B.将
-c
添加到CFLAGS
是错误的,编译.c
文件的隐式规则已经包含-c
,就像C++文件的隐式规则包括-c
一样。这不会造成任何问题,因为您的makefile或编译CFLAGS
文件的隐式规则未使用.cpp
变量。N.B.而不是链接到
-lpthread
,您应该使用-pthread
编译和链接N.B.链接和makefile约定的隐式规则是将
LDFLAGS
变量用作链接器选项,并将LIBS
变量用于诸如-lpthread
的库,因此我将您的makefile重写为:OBJS = clitest.o Sources/NClient.o
CXX = g++
DEBUG = -g
CXXFLAGS = -Wall $(DEBUG) -std=c++11 -pthread
LDFLAGS = -pthread
clitest: $(OBJS)
$(CXX) $(LDFLAGS) -o $@ $^ $(LIBS)
这仍然依赖于将
.cpp
文件转换为.o
文件的隐式规则,但是现在,该隐式规则将从CXXFLAGS
变量中选取正确的选项。