2015-11-13 5 views
3

Я пробовал совет в this answer, но это для GCC и в любом случае не помогло.Как включить -std = C++ 11 и -lpthread в makefile?

Я хочу #include <thread> в файле, так что у меня есть сделать файл как следующее:

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.

Я считаю, что это команда это работает?

[[email protected] 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 [email protected] $< 

, поэтому для добавления параметров, которые влияют на это правило, вы должны добавить их в переменную CXXFLAGS (CFLAGS обычно используется для компиляции файлов C, а CC - это компилятор C, обычная переменная для компилятора C++ равна CXX).

Опция -lpthread является опцией компоновщика, поэтому ее необходимо указывать во время связывания. Вы определили свое собственное правило для связывания, поэтому вы должны либо добавить -lpthread к этому рецепту, либо добавить его в переменную LFLAGS.

N.B. использование -Wall и -g во время связывания бесполезно, они не имеют никакого эффекта.

N.B. добавление -c к CFLAGS неверно, неявные правила для компиляции файлов .c уже включают -c, так же как неявный для файлов C++ включает -c. Это не вызывает никаких проблем, поскольку переменная CFLAGS не используется вашим make-файлом или неявным правилом для компиляции файлов .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 [email protected] $^ $(LIBS) 

Это все еще полагается на неявное правило для превращения файлов .cpp в файлы .o, но теперь это неявное правило подберет правильные параметры из переменной CXXFLAGS.

1

Добавить в 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 

Как видно из вашего вывода командной строки

[[email protected] NClient]make 
g++ -c -o clitest.o clitest.cpp 

другие флаги из CFLAGS также не были использованы для составления ,

+0

Он по-прежнему делает ту же ошибку - я добавил некоторые релевантный код на вопрос. – galois

+0

@jaska Кажется, вы не переопределяете правило '% o:% .cpp' в своем make-файле. Поставьте те же опции в 'CXXFLAGS', пожалуйста. –

0

Это эффективные параметры командной строки для 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 
+0

Я тоже так думал, но он отлично работал без «-pthread» и т. Д. – galois

+0

Правильное написание опции «-std' не' --std' –

+0

@JonathanWakely Whoops. Благодаря! – Joe

Смежные вопросы