C++ 如何在mac上编译时利用此错误?

C++ 如何在mac上编译时利用此错误?,c++,gcc,compiler-errors,clang,C++,Gcc,Compiler Errors,Clang,早上好, 我在mac上编译我的项目时遇到了一些问题。我正在使用Makefile进行编译,当我执行make命令时,会出现错误。问题是,在docker下,编译工作非常好,但是对于这个项目,我需要在mac下编译它,因为我使用的库没有安装在docker下,我现在没有时间。我认为这可能是因为shell使用clang进行编译,而我习惯使用GCC。我在mac下是全新的,所以我不知道该怎么做才能避免这种情况 MY_INFO$ make c++ -c -o *.o Input.cpp In file inc

早上好, 我在mac上编译我的项目时遇到了一些问题。我正在使用
Makefile
进行编译,当我执行
make
命令时,会出现错误。问题是,在docker下,编译工作非常好,但是对于这个项目,我需要在mac下编译它,因为我使用的库没有安装在docker下,我现在没有时间。我认为这可能是因为shell使用
clang
进行编译,而我习惯使用
GCC
。我在mac下是全新的,所以我不知道该怎么做才能避免这种情况

MY_INFO$ make
c++    -c -o *.o Input.cpp
In file included from Input.cpp:8:
In file included from ./Input.hpp:11:
./Error.hpp:19:9: error: exception specification of overriding function is more lax than base version
        ~Error() = default;
        ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/exception:101:13: note: overridden virtual function is here
    virtual ~exception() _NOEXCEPT;
            ^
In file included from Input.cpp:8:
In file included from ./Input.hpp:11:
./Error.hpp:19:20: warning: defaulted function definitions are a C++11 extension [-Wc++11-extensions]
        ~Error() = default;
                   ^
./Error.hpp:21:17: error: exception specification of overriding function is more lax than base version
    const char *what() const noexcept {return _msg;}
                ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/exception:102:25: note: overridden virtual function is here
    virtual const char* what() const _NOEXCEPT;
                        ^
In file included from Input.cpp:8:
In file included from ./Input.hpp:11:
./Error.hpp:21:29: error: expected ';' at end of declaration list
    const char *what() const noexcept {return _msg;}
                            ^
                            ;
./Error.hpp:18:15: error: member initializer '_msg' does not name a non-static data member or base class
            : _msg(msg), _file(file), _line(line) {}
              ^~~~~~~~~
In file included from Input.cpp:8:
./Input.hpp:18:9: error: exception specification of overriding function is more lax than base version
        ~InputSoundError() = default;
        ^
./Error.hpp:19:9: note: overridden virtual function is here
        ~Error() = default;
        ^
In file included from Input.cpp:8:
./Input.hpp:18:30: warning: defaulted function definitions are a C++11 extension [-Wc++11-extensions]
        ~InputSoundError() = default;
                             ^
2 warnings and 5 errors generated.
make: *** [*.o] Error 1

MY_INFO$ gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 11.0.3 (clang-1103.0.32.62)
Target: x86_64-apple-darwin19.2.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
下面是我的makefile

SRC     =   *.cpp
OBJ     =   $(foreach source, $(SRC), $(source:.cpp=.o))
NAME    =   SoundTest
CFLAGS  =   -g -Wall -Wextra -std=c++11
LDFLAGS =   -lportaudio
CC      =   g++
LD      =   g++

all: $(NAME)

$(NAME): $(OBJ)
    $(LD) -o $@ $^ $(LDFLAGS)

obj/%.o: %.cpp
    $(CC) -o $@ -c $^ $(CFLAGS)

clean:
    rm -rf $(OBJ)

fclean: clean
    rm -rf $(NAME)

re: fclean all

在不知道Makefile的内容的情况下,我们可以看到您只需调用

c++-c-o*.o输入.cpp

从它。我不知道你的编译器是什么,也不知道它的版本,也许它是一个旧的叮当声

当我们看到很多包含“是C++11扩展名”的警告时,您应该尝试在Makefile的某个地方添加
--std=C++11
。通常,您会发现类似于
cxflags+=…
的行。在这里,您可以添加
--std=c++11
标志来使用c++11

也许你的编译器太旧了,没有完全的c++11支持。在这种情况下,您必须更新


要获得更详细的答案,我们需要您的Makefile和给定的编译器,包括版本。

您的Makefile有一些问题。首先,您不能使用
*”全局文件名。cpp
--
make
有它自己的功能,所以您应该使用

SRC = $(wildcard *.cpp)
您还可以使用以下内容检查
SRC
变量的值:

$(info SRC=[$(SRC)])
接下来,构建对象文件的规则是

obj/%.o: %.cpp
    $(CC) -o $@ -c $^ $(CFLAGS)
因此,对于任何给定的源文件
foo.cpp
,该规则告诉make如何从该源文件构建
obj/foo.o
。但是您可以根据源文件名使用

OBJ = $(foreach source, $(SRC), $(source:.cpp=.o))
因此,如果
SRC
是,例如
a.cpp b.cpp
那么
OBJ
a.o b.o
而不是
OBJ/a.o OBJ/b.o
,这是使用
OBJ/.o:%.cpp
规则所需要的。您真正想要的是
OBJ
成为
OBJ/a.o OBJ/b.o
(通过示例),因此变量定义应该是

OBJ = $(patsubst %.cpp,obj/%.o,$(SRC))
把这些片段放在一起会得到

SRC     =   $(wildcard *.cpp)
OBJ     =   $(patsubst %.cpp,obj/%.o,$(SRC))
NAME    =   SoundTest
CFLAGS  =   -g -Wall -Wextra -std=c++11
LDFLAGS =   -lportaudio
CC      =   g++
LD      =   g++

all: $(NAME)

$(NAME): $(OBJ)
    $(LD) -o $@ $^ $(LDFLAGS)

obj/%.o: %.cpp
    $(CC) -o $@ -c $^ $(CFLAGS)

clean:
    rm -rf $(OBJ)

fclean: clean
    rm -rf $(NAME)

re: fclean all

是不是
std::cout@Eljay输出是
199711
我不认为你的
obj/%.o:%.cpp
规则被使用,因为你实际上是在试图从
foo.cpp
构建
foo.o
——而不是
obj/foo.o
。在这种情况下,使用的内置规则没有使用
CFLAGS
。尝试将
OBJ
的定义更改为
OBJ=$(patsubst%.cpp,OBJ/%.o,$(SRC))
。还将
SRC
的定义更改为
SRC=$(通配符*.cpp)
。我更新了帖子。<代码> STD= C++ 11 已经存在,仍然没有解决我的问题。@ HISROSth.奇特,你有<代码>——STD=C++ 11 但<>代码>CPLUS PLUS > <代码> 199711 <代码>。是的,但是有没有办法改变我的C++版本呢?