Как включить -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 3

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. вместо ссылки на -lpthread следует скомпилировать и связать с -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.

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