【问题标题】:How to get ride of this error during compilation on mac?在mac上编译期间如何摆脱这个错误?
【发布时间】:2021-01-13 05:37:27
【问题描述】:

早上好, 我在 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

【问题讨论】:

  • std::cout << "C++ is " << __cplusplus << "\n"; 输出 201703 吗?
  • @Eljay 输出为199711
  • 我不认为你的obj/%.o: %.cpp 规则正在被使用,因为你实际上是在尝试从foo.cpp 构建foo.o——而不是obj/foo.o。在这种情况下,正在使用未使用CFLAGS 的内置规则。尝试将 OBJ 的定义更改为 OBJ = $(patsubst %.cpp,obj/%.o,$(SRC)) 。还将SRC的定义更改为SRC = $(wildcard *.cpp)

标签: c++ gcc compiler-errors clang


【解决方案1】:

您的 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 然后OBJa.o b.o 不是 obj/a.o obj/b.o 需要使用obj/%.o: %.cpp 规则。你真正想要的是 OBJobj/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

【讨论】:

    【解决方案2】:

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

    c++ -c -o *.o Input.cpp

    从中。我不知道你的编译器是什么,也不知道它的版本,也许它是一个较旧的clang。

    当我们看到很多包含“是 C++11 扩展”的警告时,您应该尝试在 Makefile 中的某处添加 --std=c++11。通常你会找到像CXXFLAGS+=... 这样的行。在这里您可以添加--std=c++11 标志以使用c++11。

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

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

    【讨论】:

    • 我更新了帖子。 std=c++11 已经存在,但仍然没有解决我的问题。
    • @hissroth • 奇怪的是你有--std=c++11__cplusplus199711
    • 是的,但是有没有办法改变我的 c++ 版本?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多