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

时间:2015-11-13 09:02:40

标签: c++ c++11 makefile g++ pthreads

我在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();

3 个答案:

答案 0 :(得分:5)

你的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变量中选择正确的选项。

答案 1 :(得分:1)

添加到CFLAGSLFLAGS

CFLAGS  = -Wall -c $(DEBUG) -std=c++11 -pthread
LFLAGS  = -Wall $(DEBUG) -std=c++11 -pthread

这应该足够了。

对于隐式规则,也会覆盖CXXFLAGS变量

CXXFLAGS  = -Wall -c $(DEBUG) -std=c++11 -pthread

从命令行输出中看到

[jaska@localhost NClient]make
g++    -c -o clitest.o clitest.cpp

来自CFLAGS的其他标志也未用于编译。

答案 2 :(得分:0)

它们是gcc / g ++或ld(链接器)的有效命令行参数。所以它们必须作为CFLAGS和LFLAGS的补充传递(或者可能作为CXXFLAGS,CPPFLAGS,LDFLAGS,具体取决于Makefile的功能)。您的示例并未显示您将CFLAGS传递给C ++编译器,因此这也存在问题。明确传递它或为您的C ++编译器设置CXXFLAGS(C不是C ++)。

我建议你最初在命令行解决问题,然后当它工作时转到Makefile。实际上,您正在努力让Make创建该行:

g++ -Wall -g -std=c++11 -pthread clitest.o Sources/NCLient.o -o clitest