cc1: error: command line option ‘-std=c++11’ is valid for C++/ObjC++ but not for C [-Werror] - c++11

I need the -std=c++11 flag for c++ modules when compile nginx. If I configure nginx with --with-cc-opt="-std=c++11" and then make. It gives me the error described in the title. How can I get it compile without modifing nginx source code or the compiler(for now it's gcc 4.8) version?

According to the documentation: "--with-cc-opt=parameters — sets additional parameters that will be added to the CFLAGS variable."
CFLAGS enables the addition of switches for the C compiler, while CXXFLAGS is meant to be used when invoking a C++ compiler.

Related

setting g++ mode to C++11

I am trying to build cmake source, which requires C++11.
The build halts and apparently the complaint is that C++11 is not detected. The g++ mode is actually set to -std=gnu++17
This is part of the console log
---------------------------------------------
CMake 3.18.20200919, Copyright 2000-2020 Kitware, Inc. and Contributors
Found GNU toolchain
C compiler on this system is: gcc
C++ compiler on this system is: g++ -std=gnu++17
Makefile processor on this system is: make
g++ has setenv
g++ has unsetenv
g++ does not have environ in stdlib.h
g++ has stl wstring
g++ has <ext/stdio_filebuf.h>
---------------------------------------------
g++ -std=gnu++17 -DCMAKE_BOOTSTRAP -DCMake_HAVE_CXX_MAKE_UNIQUE=1 -c $HOME/Apps/CMake-master/Source/cmAddCustomCommandCommand.cxx -o cmAddCustomCommandCommand.o
This is part of the error in the log file...
In file included from /usr/include/c++/5/unordered_map:35:0,
from cmake_bootstrap_11920_test.cxx:4:
/usr/include/c++/5/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
#error This file requires compiler and library support \
^
cmake_bootstrap_11920_test.cxx:7:2: error: #error "Compiler is not in a mode aware of C++11."
#error "Compiler is not in a mode aware of C++11."
^
cmake_bootstrap_11920_test.cxx:70:16: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11
int Member = 1;
Looking around on the web, I noticed that C++11 is only available after gcc version 4.6.
I checked my version, and it seems to be above.
g++ --version
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609
I understand the -std=c++11 flag is used to enable the C++11 features in g++, but I don't seem to know what I am doing in this case.
I tried editing the CompileFlags.cmake file, but no change occurs.
I came upon this page which points to the cmake source I am using.
It says...
bootstrap: Require compiler mode aware of C++11
Some compilers have enough features enabled in their default modes to
pass our simple C++11 unique_ptr check but do not enable enough to build
CMake. Poison this case so that we choose one of the explicit `-std=`
options for such compilers.
Not sure what that means exactly.
How exactly do I change the g++ mode, to C++11, so that on running the bootstrap command, C++11 is used?
Or, in other words, how do I change std to point to C++11 (-std=c++11)?
First of all, you have g++ version 5.4.0 in your host PC installed, which is good, cause it means this is also supports the C++11, which you want to use.
To set it up, you could define it in your CMakeList.txt file:
set (CMAKE_CXX_STANDARD 11)
that should do the trick.
Please also check the documentation:
https://cmake.org/cmake/help/v3.1/variable/CMAKE_CXX_STANDARD.html
Usually, I would suggest to use the latest standard that you compiler is supporting (https://gcc.gnu.org/projects/cxx-status.html), cause you'll get also the latest features introduced in that standard. Exception for this rather in case you are working with legacy codes.

cgo doesn't include CXXFLAGS

I want to call C code in Golang:
// #cgo CFLAGS: -I/usr/include/c++/8.1.1/bits
// #cgo CXXFLAGS: -std=gnu++11
// #include "c++0x_warning.h"
import "C"
but get error:
In file included from ./main.go:5:
/usr/include/c++/8.1.1/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
So cgo doesn't use CXXFLAGS. I tried -std=c++11 and it doesn't work too. What I do wrong?
$ go version
go version go1.10.3 linux/amd64
Please refer to the following SO question: Difference between CPPFLAGS and CXXFLAGS in GNU Make to figure out which flags you really need in the context of your program.
If you are calling pure C code (and not C++ code), I don't think you will need CXX_FLAGS:
CPPFLAGS are supposed to be flags for the C PreProcessor; CXXFLAGS are flags for the C++ compiler.
You might also want to check your go env. If you really need this flag, you can try to compile your program using env CGO_CXXFLAGS="-std=c++11" go build <YOUR_CODE>.

Suppress warning "-std=c99 is not for C++"?

I use Orwell Dev-C++ IDE as my working environment. As a student and indie developer, I write both C codes and C++ codes, so I added this into "Compiler Options" settings
-std=c11 -std=c++17 -Wall -Wextra -s
Dev-C++ calls gcc.exe and g++.exe depending on file extension, so I can't create separate compiler profiles for C and C++. Then whenever I compile a program, either compiler says
[Warning] command line option '-std=c11' is valid for C/ObjC but not for C++
[Warning] command line option '-std=c++17' is valid for C++ but not for C
I am completely sure that it's safe to ignore this specific warning, but I'd like to suppress it. Is there anything I can supply to gcc/g++ so it doesn't generate this warning?
In case it depends, I use MinGW GCC/G++ 6.3.0.

Compiler require c++0x but flag already add in the command

The version of compiler is 4.4.6 and it should support c++0x as indicated here: https://gcc.gnu.org/gcc-4.4/cxx0x_status.html
But I still get below compile error:
*In file included from /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/cinttypes:35,
...
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/c++0x_warning.h:31:2:
error: #error This file requires compiler and library support for the
upcoming ISO C++ standard, C++0x. This support is currently
experimental, and must be enabled with the -std=c++0x or -std=gnu++0x
compiler options.*
The flag is already added in makefile as below:
g++ **-std=c++0x** $(LDFLAGS) $(Objs) -o Test
I tried -std=gnu++0x but doesn't work.
You have added the option to your link command, not your compile command. You need to add it to CXXFLAGS.

AVR32/GCC Linker warning: input is not relaxable

I am trying to compile an AVR32 program with GCC 3.4.2 and getting the following linker warning:
input is not relaxable
Could someone explain what that warning means?
Linker flags: -Wl,--start-group -Wl,--end-group -Wl,--gc-sections -mpart=uc3c0512c -Wl,--relax -Wl,-e,_trampoline
From Atmel
Linker relaxing is enabled in the linker by passing the ‘—relax’
option to the linker. If using GCC as a frontend for the linker, this
option is automatically passed to the linker when using ‘-O2’ or
‘-O3’ or explicitly using the ‘-mrelax’ option. Marking the output
objects from GCC as relaxable is done by giving the assembler the
‘--linkrelax’ option. This option is automatically passed on to the
assembler from GCC when using ‘-O2’ or ‘-O3’ or explicitly using the
‘-mrelax’ option.
Perhaps you didn't pass the needed options to the assembler for the --relax option to work in the linker.

Resources