Как включить -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следует скомпилировать и связать с-pthreadLDFLAGSдля параметров компоновщика и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иLFLAGSCFLAGS = -Wall -c $(DEBUG) -std=c++11 -pthread LFLAGS = -Wall $(DEBUG) -std=c++11 -pthread, Что должно быть достаточно.
Для неявных правил также перепишите переменную
CXXFLAGSCXXFLAGS = -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