Questions tagged «gcc»

GCC是GNU编译器集合。它是Linux上针对C,C ++,Go,Fortran和Ada的事实上的标准编译器,并且还支持许多其他语言和平台。除编译器外,GCC还具有一个工具链(libc,libstdc ++,objdump,nm等),该工具链已在多个平台和系统上广泛使用。

6
用于memcpy的增强型REP MOVSB
我想使用增强的REP MOVSB(ERMSB)为自定义获取高带宽memcpy。 ERMSB是与Ivy Bridge微体系结构一起引入的。如果您不知道什么是ERMSB,请参阅英特尔优化手册中的“增强型REP MOVSB和STOSB操作(ERMSB)”部分。 我知道直接执行此操作的唯一方法是内联汇编。我从https://groups.google.com/forum/#!topic/gnu.gcc.help/-Bmlm_EG_fE获得了以下功能 static inline void *__movsb(void *d, const void *s, size_t n) { asm volatile ("rep movsb" : "=D" (d), "=S" (s), "=c" (n) : "0" (d), "1" (s), "2" (n) : "memory"); return d; } 但是,当我使用它时,带宽远小于memcpy。 我的i7-6700HQ(Skylake)系统,Ubuntu 16.10,DDR4 @ 2400 MHz双通道32 GB,GCC 6.2可达到__movsb15 GB / …
71 c  gcc  assembly  x86  memcpy 

3
强制gcc在64位平台上编译32位程序
我有一个专有程序,试图在64位系统上使用。 当我启动安装程序时,它工作正常,但是在尝试更新自身并编译某些模块后,它无法加载它们。 我怀疑这是因为它正在使用gcc,而gcc试图将它们编译为64位系统,因此该程序无法使用这些模块。 是否有任何方法(一些环境变量或类似的东西)强制gcc为32位平台执行所有操作。32位chroot可以工作吗?
70 linux  gcc  32-bit  x86-64 

11
将GCC分别称为“ cc”和“ gcc”
我知道在大多数GNU / Linux系统上,可以从命令行通过名称“ cc”(而不是“ gcc”)调用GCC。一种方式与另一种方式调用时,GCC的行为是否有差异? 例如,我知道通过名称“ g ++”而不是“ gcc”调用GCC会导致GCC行为不同(它将.c文件视为C ++源代码,并在C ++标准库中链接)。“ gcc”与“ cc”之间在行为上是否有类似的区别? 编辑:到目前为止,关于GCC如果以一种方式调用还是以另一种方式调用,行为是否有所不同,到目前为止,没有一个答案给出明确的“是”或“否”。但是,提出深入研究源代码以检查其行为的想法使我沿着这条路走了。根据我在那里的发现,我现在认为答案是: 否。无论通过“ gcc”还是“ cc”调用,GCC的行为都相同。


2
gcc在i686上找不到bits / predefs.h
好的,所以我从64位的ubuntu 12.04切换到了32位并安装了 build-essential. 然后,我编译并安装了GMP-5.0.5,MPFR-3.1.1,MPC-1.0,ISL-0.10和CLOOG-0.17.0。我签出了主gcc干线的副本,并尝试使用以下配置行(从单独的目录)构建它: ../svnsrc/configure --prefix=/usr/GCC/svn --enable-__cxa_atexit --with-plugin-ld=/usr/bin/ld.gold --enable-threads=posix --enable-werror --enable-build-with-cxx --with-gmp=/usr/GCC/prereq/svn --with-mpfr=/usr/GCC/prereq/svn --with-mpc=/usr/GCC/prereq/svn --with-isl=/usr/GCC/prereq/svn --with-cloog=/usr/GCC/prereq/svn --enable-languages=c,c++ 配置运行正常,所以我运行了make && make check。可以运行一会儿,但是随后失败,并显示以下错误: /home/matt/GCC/svnbuild/./gcc/xgcc -B/home/matt/GCC/svnbuild/./gcc/ -B/usr/GCC/svn/i686-pc-linux-gnu/bin/ -B/usr/GCC/svn/i686-pc-linux-gnu/lib/ -isystem /usr/GCC/svn/i686-pc-linux-gnu/include -isystem /usr/GCC/svn/i686-pc-linux-gnu/sys-include -g -O2 -O2 -g -O2 -DIN_GCC -W -Wall -Wwrite-strings -Wcast-qual -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition -isystem ./include -fpic -mlong-double-80 -g -DIN_LIBGCC2 -fbuilding-libgcc -fno-stack-protector …
69 gcc  ubuntu-12.04 


1
GCC的-Wpsabi选项到底能做什么?抑制它意味着什么?
背景 去年,我使用了nlohmann json库[1],并且使用GCC 5.x在x86_64上进行了交叉编译arm-linux-gnueabi-*而没有任何警告。当我将GCC更新为较新版本时,GCC会生成含糊的诊断说明页面。例如,这是注释之一 In file included from /usr/arm-linux-gnueabi/include/c++/7/vector:69:0, from include/json.hpp:58, from src/write_hsi.cpp:23: /usr/arm-linux-gnueabi/include/c++/7/bits/vector.tcc: In member function ‘void std::vector<_Tp, _Alloc>::_M_realloc_insert(std::vector<_Tp, _Alloc>::iterator, _Args&& ...) [with _Args = {nlohmann::basic_json<std::map, std::vector, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool, long long int, long long unsigned int, double, std::allocator, nlohmann::adl_serializer>}; _Tp = nlohmann::basic_json<>; _Alloc = std::allocator<nlohmann::basic_json<> >]’: …
69 c++  linux  gcc  gcc-warning  abi 

6
Linux静态链接已死?
实际上,Linux上的-static gcc标志现在不起作用。让我从GNU libc常见问题中引用: 2.22。即使是静态链接程序也需要一些共享库,这对我来说是不可接受的。我能做什么? {AJ} NSS(有关详细信息,请键入`info libc“名称服务开关”“)在没有共享库的情况下无法正常工作。NSS只需更改一个配置文件(/etc/nsswitch.conf)即可使用不同的服务(例如NIS,文件,db,hesiod),而无需重新链接任何程序。唯一的缺点是现在静态库需要访问共享库。这由GNU C库透明地处理。 一种解决方案是使用--enable-static-nss配置glibc。在这种情况下,您可以创建仅使用服务dns和文件的静态二进制文件(为此更改/etc/nsswitch.conf)。您需要明确链接所有这些服务。例如: gcc -static test-netdb.c -o test-netdb \ -Wl,--start-group -lc -lnss_files -lnss_dns -lresolv -Wl,--end-group 这种方法的问题在于,必须将使用NSS例程的每个静态程序链接到所有这些库。 {UD}实际上,无法再说使用此选项编译的libc正在使用NSS。不再有开关。因此,强烈 建议不要使用--enable-static-nss,因为这会使系统上程序的行为不一致。 关于这一事实,现在是否有任何合理的方法可以在Linux上创建功能齐全的静态构建,或者静态链接在Linux上完全无效?我的意思是静态构建: 行为与动态构建完全相同(行为不一致的static-nss是邪恶的!); 适用于合理的glibc环境和Linux版本;

2
启用优化后,为什么此代码慢6.5倍?
我想基准glibc的strlen功能,出于某种原因,发现它显然执行多慢与GCC启用优化,我不知道为什么。 这是我的代码: #include <time.h> #include <string.h> #include <stdlib.h> #include <stdio.h> int main() { char *s = calloc(1 << 20, 1); memset(s, 65, 1000000); clock_t start = clock(); for (int i = 0; i < 128; ++i) { s[strlen(s)] = 'A'; } clock_t end = clock(); printf("%lld\n", (long long)(end - start)); …
68 c  performance  gcc  glibc 

10
升级到Catalina 10.15后,无法在Mac上编译C程序
升级到Mojave后,还有一个问题无法在Mac上编译C程序,而该问题的答案已涵盖了发生问题的大多数变化。 现在-从2019年10月7日星期一开始-您可以升级到macOS Catalina 10.15。再次,在升级过程中/usr/include,即使在从Mojave 10.14.6升级到Catalina之前安装了XCode 11.0 ,该目录也已被更新所破坏。因此,编译器预期没有/usr/include目录,因此不再起作用。 建议的解决Mojave问题的主要步骤-使用以下命令: open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg 由于目录/Library/Developer/CommandLineTools/Packages/不存在(因此尚无.pkg要打开的文件),因此无法正常工作。 有没有一种好的(官方)方法来创建和填充目录/usr/include?
64 c  xcode  macos  gcc  macos-catalina 


1
gcc-10.0.1特定段错误
我有一个带有C编译代码的R软件包,该软件包相当稳定了一段时间,并且经常针对各种平台和编译器(windows / osx / debian / fedora gcc / clang)进行测试。 最近,添加了一个新平台来再次测试该软件包: Logs from checks with gcc trunk aka 10.0.1 compiled from source on Fedora 30. (For some archived packages, 10.0.0.) x86_64 Fedora 30 Linux FFLAGS="-g -O2 -mtune=native -Wall -fallow-argument-mismatch" CFLAGS="-g -O2 -Wall -pedantic -mtune=native -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong -fstack-clash-protection -fcf-protection" …

1
为什么GCC聚合数组的初始化会首先用零填充整个东西,包括非零元素?
为什么gcc用零而不是仅剩余的96个整数填充整个数组?非零初始值设定项都在数组的开头。 void *sink; void bar() { int a[100]{1,2,3,4}; sink = a; // a escapes the function asm("":::"memory"); // and compiler memory barrier // forces the compiler to materialize a[] in memory instead of optimizing away } MinGW8.1和gcc9.2都使asm像这样(Godbolt编译器资源管理器)。 # gcc9.2 -O3 -m32 -mno-sse bar(): push edi # save call-preserved EDI which …

2
lambda宏如何创建lambda?
我在GitHub上找到了这段代码,但不太了解: #define lambda(ret_type, _body) ({ ret_type _ _body _; }) 然后: int (*max)(int, int) = lambda(int, (int x, int y) { return x > y ? x : y; }); int max_value = max(1, 2); // max_value is 2 内的下划线是什么#define?它如何返回函数指针?

1
Clang不编译代码,但是gcc和msvc编译了它
我不明白这是什么问题:在我的代码中还是在编译器中(不太可能)。有一段这样的代码: #include <iostream> #include <type_traits> #include <set> template<typename T, typename = void> struct TestA: std::false_type {}; template<typename T> struct TestA<T, std::void_t<typename T::reverse_iterator>> : std::true_type {}; template<typename T> struct TestA<T, std::void_t<typename T::dummy_iterator>> : std::true_type {}; int main() { std::cout << TestA<std::set<int>>::value; } GCC和MSVC都可以对其进行编译。我使用不同版本的GCC和MSVC 17(本地)和19在Godbolt上进行了测试。这是一个链接:https ://godbolt.org/z/Enfm6L 。 但是Clang不会编译它并发出错误: redefinition of `'TestA<T, std::void_t<typename …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.