gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:23:18 24 4
gpt4 key购买 nike

我尝试了 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 变量。

注意在链接期间使用 -Wall-g 是无用的,它们没有任何效果。

注意在CFLAGS中添加-c是错误的,编译.c文件的隐式规则已经包含了-c,正如 C++ 文件的隐式包含 -c。这不会导致任何问题,因为 CFLAGS 变量未被您的 makefile 使用,也未被编译 .cpp 文件的隐式规则使用。

注意而不是链接到 -lpthread 你应该编译 and 链接 -pthread

注意链接的隐式规则和 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 变量。

关于c++ - 如何在 makefile 中包含 -std=c++11 和 -lpthread?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33689044/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com