C++ 如何在mac上编译时利用此错误?
早上好, 我在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
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++版本呢?