我在使用带-O2或-O3标志的GCC编译下面的示例时遇到了问题。
#include <string>
#include <stdexcept>
#include <iostream>
class Args {
public:
Args(int, char** argv);
const std::string get_arg() const;
private:
int argc_;
int index_ = 0;
char** argv_;
};
Args::Args(int argc, char** argv):
argc_(argc),
argv_(argv)
{
}
const std::string Args::get_arg() const
{
if (index_ >= argc_) {
throw std::out_of_range("Out of range.");
}
return std::string(argv_[index_]);
}
int main(int, char** argv)
{
Args args(0, argv);
try {
std::string a = args.get_arg(); // Must throw.
std::cout << "After get_arg(): " << a << std::endl;
} catch(std::out_of_range) {
std::cout << "Catched" << std::endl;
}
return 0;
}
使用-O3标志
编译示例时g++ -std=c++11 -Wall -pedantic -Wextra -O3 -g0 -o args args.cpp
异常std::out_of_range
未在catch blok中捕获。输出
terminate called after throwing an instance of 'std::out_of_range'
what(): Out of range.
Abort trap
如果使用没有-O2或-O3
的GCC编译示例,则一切正常g++ -std=c++11 -Wall -pedantic -Wextra -g0 -o args args.cpp
或与CLang
clang++ -std=c++11 -Wall -pedantic -Wextra -O3 -g0 -o args args.cpp
clang++ -std=c++11 -Wall -pedantic -Wextra -g0 -o args args.cpp
GCC版本:( FreeBSD Ports Collection)5.4.0
CLang版本:4.0.0
操作系统:FreeBSD 11.1(amd64)
错误在哪里?
答案 0 :(得分:0)
感谢您的导航。我在这篇文章https://stackoverflow.com/a/33279425/8838989中找到了正确的解决方案。当使用标志-Wl,-rpath=/usr/local/lib/gcc5
g++5 -std=c++11 -Wall -pedantic -Wextra -O3 -g0 -Wl,-rpath=/usr/local/lib/gcc5 -o args args.cpp