草庐IT

c++ - 在 GCC 中将 C++ 链接到 C

我在C++“静态库”项目中有一个函数extern"C"intping(void)。现在,我想编写一个简单的Hello-WorldC程序来调用此函数intx=ping();。我使用g++/gcc但我无法将C可执行文件与C++共享库链接起来。请问,怎样才能做到这一点?您能否提供准确的gcc命令?编辑:g++-c-staticliba.cpparrcsliba.aliba.ogcc-oxmain.o-L.-la并得到:./liba.a(liba.o):(.eh_frame+0x12):undefinedreferenceto`__gxx_personality_v0'collect2:ld返

c++ - 为什么 gcc 不对内部代码中的未定义行为发出警告?

我刚刚读了thisSOC++关于未定义行为和序列点的常见问题解答并进行了一些实验。在下面的代码中,gcc-4.5.2只在代码注释中提到的那一行中给我一个警告,虽然前面的一行也显示了未定义的行为,不是吗?您不能说先执行哪个加法操作数(因为+不是序列点)。为什么gcc在这一行也不给我警告?inti=0;intj=0;intfoo(void){i=1;returni;}intmain(void){i=i+foo();j=j+(j=1);//Hereisarightlywarningreturn0;}感谢您的帮助。 最佳答案 i=i+foo

c++ - 带有无符号整数的奇怪 gcc 行为

#include#include#includeusingnamespacestd;intmain(){uint16_tii;std::cin>>ii;printf("%d\n",ii);}当我输入5时,输出也是5。但是当我将ii的类型更改为uint8_t时,我没有得到5而是53这似乎是5的ASCII值。这是预期的吗? 最佳答案 uint8_t允许(但不要求)是char(如果它碰巧是无符号的)或unsignedchar的类型定义。这些输入是作为字符而不是数字完成的。所以这是有效但不是必需的行为。

c++ - GCC:禁止隐式 bool->int 转换

是否有任何gcc标志禁止隐式“bool->int”转换?我想通过这段代码得到任何警告:voidfunction(intvalue,boolflag){}intmain(){inta=123;boolflag=true;//oops,acommonmistakefunction(flag,a);} 最佳答案 作为解决方法,在C++11中,您可以删除其他可能的重载:templatevoidfunction(int,T)=delete; 关于c++-GCC:禁止隐式bool->int转换,我们

c++ - 你如何为 clang 和 gcc 编写一个 makefile?

我想在我的代码中使用std::experimental::filesystem,这需要我使用-lstdc++fs与GCC和进行编译-lc++experimental使用Clang。目前我有一个makefile和makefile.clang反射(reflect)了编译的差异,或者我考虑过使用clang构建目标以便我可以运行buildclang.是否有一些规范的方法可以在makefile中设置特定于编译器的标志? 最佳答案 正如用户“Someprogrammerdude”提到的,有conditionals在GNU中。您可以通过这种方式轻

c++ - GCC 编译的静态库包含什么?

我的应用程序链接到libsamplerate.a。我这样做是为了更轻松地分发最终的二进制文件。我担心.a文件中的代码可能依赖于我也需要分发的其他一些库。但如果不是这样,我担心我会通过包含多个拷贝来过度膨胀我的应用程序。库。libsamplerate.a中到底有什么?只是libsamperate的字节码?还是更多? 最佳答案 一个.a文件基本上就是一堆.o文件。您可以使用ar工具对此进行演示。例如,要显示您图书馆的内容:ar-tlibsamplerate.a从头开始创建.a文件:ar-rtim.a*.txt

C++ (gcc/g++) 两个巨大的字符串数组需要很长时间才能编译

对于用C++编写的程序,我需要两个包含数据的巨大字符串数组。它们在头文件中定义如下:#includestaticconststringstrdataA[30000]={"thisisthefirstlineofthedata","thesecondlineofdata","otherstuffinthethirdline",下降到"lastline."};//secondarraystringsstaticconststringstrdataB[60000]={"thisisthefirstlineofthedata","thesecondlineofdata","otherstuff

c++ - 为什么 clang 或 gcc 不标记这种从 double 到 int 的隐式转换?

考虑以下代码:voidf(intx){std::cout这会在没有任何警告的情况下编译和运行(使用-Wall),因此隐藏了从double到int的危险隐式转换。如果使用文字调用函数,编译器将捕获转换,即f(1.5)但这并不是那么有用。为什么这些编译器不对此转换发出警告?我在OSX10.8.3上使用gcc-4.2.1和clang-425.0.28。 最佳答案 为了后代:为了避免隐式转换,请使用-Wconversion标志(它不包含在-Wall中)。Clang实际上在-Weverything标志中包含-Wconversion,但此标志启

c++ - "- </dev/null"中的 "gcc -dM -E - </dev/null"是什么意思?

我知道用gcc-dM-E-可以得到gcc的预定义宏,但是-在这个命令中是什么意思?按照我的理解,-后面应该有一个选项。我试图搜索gccmanual,但找不到答案。 最佳答案 就其本身而言,-意思是“从标准输入中读取,而不是从该命令行上提供的文件名中读取”。这是一个常见的Unix约定。从/dev/null重定向标准输入,其长度为0。因此GCC将从标准输入读取并立即到达输入的末尾,使其仅打印预定义的宏(而不是输入中的任何宏,因为没有任何输入)。这是标准的shell语法,不特定于GCC的调用。它们共同构成了一种不向需要输入的流程提供输入的

c++ - 为什么 Folly 的共享库引用了来自 Boost 的错误符号? (OS X 上的 GCC)

我正在尝试构建和运行一个使用Folly的小型示例应用程序在OSXYosemite上使用GCC4.9.3。这是源代码:#includeintmain(){folly::AtomicHashMapmap(256);map.insert(std::make_pair(1,1));return0;}我从源代码构建并安装了Boost(1.59.0)和Folly(最新的GitHubhead),确保使用了GCC,现在它们的库和header在/usr/local中可用。.GCC和其他依赖项是使用MacPorts安装的。我可以使用以下命令行成功构建上述示例:$g++-mp-4.9main.cpp-std