如何在makefile中包含-std = c ++ 11和-lpthread?

gal*_*ois 3 c++ makefile g++ pthreads c++11

我在这个答案中尝试了这个建议,但它适用于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
Run Code Online (Sandbox Code Playgroud)

我应该在哪里包括-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
Run Code Online (Sandbox Code Playgroud)

这里也是源代码文件:

#include <thread>
#include <string>

void task(std::string msg){
    std::cout << msg << '\n';
}

...
...

std::thread t1(task, "message");
client->create();
t1.join();
Run Code Online (Sandbox Code Playgroud)

Jon*_*ely 5

您的makefile没有用于编译对象的明确规则,$(OBJS)这意味着将使用隐式规则,这是产生此命令的原因:

g++    -c -o clitest.o clitest.cpp
Run Code Online (Sandbox Code Playgroud)

.cpp文件转换为.o文件的隐式规则大致为:

$(CXX) $(CXXFLAGS) -c -o $@ $<
Run Code Online (Sandbox Code Playgroud)

所以要添加影响该规则的选项,你应该将它们添加到CXXFLAGS变量中(CFLAGS通常用于编译C文件,并且CC是C编译器,C++编译器的常规变量是CXX).

-lpthread选项是链接器选项,因此需要在链接期间给出.您已经定义了自己的链接规则,因此您应该添加-lpthread到该配方或将其添加到LFLAGS变量中.

NB使用-Wall-g链接期间没用,它们没有效果.

NB添加-cCFLAGS是错误的,因为编译潜规则.c的文件已经包括-c,就像一个隐含的C++文件包括-c.这不会导致任何问题,因为CFLAGSmakefile不使用该变量,也不会使用隐式规则来编译.cpp文件.

NB而不是链接到-lpthread你应该编译链接-pthread

NB链接和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)
Run Code Online (Sandbox Code Playgroud)

这仍然依赖于将.cpp文件转换为.o文件的隐式规则,但现在隐式规则将从CXXFLAGS变量中选择正确的选项.