这有点类似于“禁用 C++ 异常,如何使任何 std:: throw() 立即终止? ”。我希望每当 STL 抛出异常时我的程序就终止。
问题如下:我正在编写一个库,然后将其作为共享对象加载并由我无法控制的程序执行。不幸的是,这个程序在一个大的尝试块中运行所有内容,这样如果抛出错误,我就不会得到堆栈跟踪/核心转储,从而使::at函数类的超出范围错误变得无用。
这听起来像是 -fno-exceptions 的理想用例,但我不能只使用 -fno-exceptions,因为 boost_log 和调用我的程序都在其标头中定义了异常处理,从而给我带来了 -fno-exceptions 的编译错误。
有没有办法只对 stl 异常启用 -fno-exceptions ?
像许多人一样,我使用大量警告标志构建我的项目。
由于并非所有警告标志都是有害的,因此编译会变得嘈杂。
诸如“未使用的变量”、“初始化列表中的隐藏成员”、“缺少开关默认值”等警告都很重要,但它们在构建过程中会造成太多混乱,并且很难发现重要的警告。
给定一个大型项目,可能会有数以千计的警告与构建语句混合在一起,尽管之后解析它会变得很繁重。在代码中维护编译器编译指示和推送/弹出警告同样是不可取的。
如何以结构化格式转储编译器警告?
无论是 XML、JSON、YAML、CSV,有没有办法告诉编译器转储所有发出的警告?这样的格式可以让我更有效地查看警告,并按类型、文件、数量等对它们进行排序。
我们什么时候使用 gcc -u 编译器选项?您也可以举个例子吗?
https://gcc.gnu.org/onlinedocs/gcc-2.95.2/gcc_2.html 内容如下:
假装符号symbol未定义,以强制链接库模块来定义它。您可以多次使用带有不同符号的“-u”来强制加载其他库模块。
我正在尝试构建一个 node.js C++ 使用,node-gyp但无法弄清楚如何指定,-Wl,-rpath,$ORIGIN以便从 node 加载时它可以找到与addon.node.
我试过这样设置我的binding.gyp:
"libraries": [
"-L../../install_release_x64/",
"-llibppp"
],
"ldflags": [
"-Wl,-rpath,'$ORIGIN'"
],
"cflags_cc": [
"-fexceptions",
"-fPIC",
"-Wno-unknown-pragmas"
]
Run Code Online (Sandbox Code Playgroud)
但是当我运行时$ readelf -d addon.node,结果是这样的:
Dynamic section at offset 0x7d10 contains 29 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [liblibppp.so]
0x0000000000000001 (NEEDED) Shared library: [libstdc++.so.6]
0x0000000000000001 (NEEDED) Shared library: [libgcc_s.so.1]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000000e (SONAME) Library soname: [addon.node]
0x000000000000000f (RPATH) Library rpath: [RIGIN]
0x000000000000000c (INIT) 0x37a0 …Run Code Online (Sandbox Code Playgroud) 假设我的 C++ 符合标准并且我不依赖第三方库,那么在将 makefile 中的“g++”替换为“clang++”时遇到的常见陷阱是什么?像不兼容的编译器选项、选项顺序的不同要求、其他一些限制等。
当我编译这个实验代码时:
int main(void)
{
int foo = 5;
char bar[foo];
}
Run Code Online (Sandbox Code Playgroud)
使用 clang 和'-Weverything'单独的'-Wvla'标志或单独的标志与标志相结合'-std=c99',我仍然收到警告:
警告:使用可变长度数组 [-Wvla]
尽管与后来的 C 标准(C11、C18 等)相比,符合 C99 的实现将无一例外地支持可变长度数组,其中 VLA 支持是可选的。
'-std=c99'clang 标志的 VLA 时仍然收到此警告?相关问题: 如何在两个单独的步骤中运行MSVC预处理器和编译器?
我明确地预处理MyFile.cpp(不编译)到a MyFile.i.我想稍后"编译"该文件(显式跳过预处理会很好,但正如相关问题所示,听起来这对MSVS来说是不可能的.)
问题:这MyFile.i是一个"无法识别的扩展",并cl.exe假设它是一个"目标文件",导致"无操作".(请参阅Microsoft警告:http: //msdn.microsoft.com/en-us/library/zfsbakc5(v = VS.90).aspx,此警告对MSVS 2005,2008,2010有效).
我找不到一个开关来声明它是一个"源文件"(不是目标文件).相关问题明确使用了" MyFile_preprocessed.cpp"惯例,但我真的宁愿遵守(更普遍的)MyFile.i惯例.
问题:是否有可以MyFile.i用MSVS 编译的标志?
c++ compiler-construction compiler-flags visual-c++ c-preprocessor
所以我知道我可以使用-Werror = ...将警告变成错误但是我想将以下警告变成错误:
"类xxx具有虚函数但非虚析构函数"
我知道你可以得到这个错误的唯一方法是打开过度讨厌的-Weffc ++标志.有没有办法(或者这个警告的-Weffc ++中的子标志)只打印此警告然后将其变成错误?
谢谢!
我听说你可以使用g ++的-DN标志在编译期间在c ++程序中设置值.任何人都可以解释一下吗?谢谢
我全都用Google搜索了!感谢任何可以帮助我的人......
我已经构建了test.so并希望使用dlfcn.h中定义的dlopen(),dlsym()等动态调用它
我可以在命令行上编译我的调用程序(main.cpp)而不会出错
g++ main.cpp -ldl -o myprog
Run Code Online (Sandbox Code Playgroud)
没有-ldl开关,我得到错误:undefined reference dlopen().此外,如果-ldl开关未放置在g ++参数列表中的源文件之后,那么我会得到相同的错误.
我的问题是:如何在Qt Creator中编译main.cpp?Qt Creator报告相同的错误:未定义的引用dlopen()
我试过直接将-ldl对Makefile(CFLAGS,CXXFLAGS,LFLAGS),但无济于事标志.(也许在源文件之前插入标志,其中-ldl不起作用?)
这是我的main.cpp:
#include <dlfcn.h>
int main()
{
void* handle = dlopen("./test.so", RTLD_LAZY);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在linux上使用Qt Creator 2.4.1
非常感谢 :)