Как включить -std=c++11 и -lpthread в makefile?
Я попробовал совет в этот ответ, но это для 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 ответа:
В вашем файле 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
. Это не вызывает никаких проблем, поскольку переменнаяCFLAGS
не используется вашим файлом makefile или неявным правилом для компиляции файлов.cpp
.N. B. вместо ссылки на
Неявное правило для связывания и соглашение makefile - это использовать переменную-lpthread
следует скомпилировать и связать с-pthread
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
.
Добавить к
CFLAGS
иLFLAGS
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
также не использовались для компиляции.
Они фактически являются параметрами командной строки для gcc / g++ или LD, компоновщика. Поэтому они должны передаваться как дополнения к CFLAGS и LFLAGS (или, возможно, как CXXFLAGS, CPPFLAGS, LDFLAGS в зависимости от того, как функционирует файл Makefile). Однако в вашем примере не показано, как вы передаете CFLAGS компилятору C++, так что это также проблематично. Передайте его явно или установите CXXFLAGS для вашего компилятора C++ (C-это не C++).
Я бы предложил вам решить вашу проблему сначала в командной строке, а затем когда это работает, перейдите к файлу Makefile. Эффективно вы пытаетесь сделать, чтобы создать строку:
g++ -Wall -g -std=c++11 -pthread clitest.o Sources/NCLient.o -o clitest