使用 GCC 强制自动矢量化
在这里我非常简单的问题.对于ICC,我知道可以使用#pragma SIMD强制编译器选择不矢量化的循环的矢量化.海湾合作委员会有类似的东西吗?或者,是否有任何计划在以后的版本中添加此功能? 非常相关,用石墨强迫矢量化呢? 解决方案 只要允许GCC使用SSE/SSE2/ETC指令,编译器就会在意识到它是"值得"的情况下总体生产矢量说明.像编译器中的大多数事情一样,这需要程序员的运气/计划/护理,以避免编译器认为"也许这不是安全"或"这太复杂,我不知道发生了什么".但是,如果您使用合理现代版本的GCC(4.x版本都应该这样做),则经常会成功. 您可以通过添加-msse>或-msse2(等稍后的SSE扩展)来使编译器使用SSE或SSE2指令. -msse2在x86-64中默认. 但是,我不知道您可以强迫这一点.编译器要么这样做是因为它很高兴它是一个很好的解决方案,要么不会. 对不起,无法回答有关石墨.
16 2024-04-22
编程技术问答社区
为什么静态库可以依赖于共享库?
据我所知,静态库不能依赖于Linux中的共享库.但是,当我编译链接到Glog.a和gflags.a的程序时,编译器报告以下错误: > /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libglog.a(libglog_la-utilities.o): > In function `google::GetStackTrace(void**, int, int) [clone .part.7]': > (.text+0xad): undefined reference to `_Ux86_64_getcontext' > (.text+0xb8): undefined reference to `_ULx86_64_init_local' > (.text+0xe7): undefined reference to `_ULx86_64_step' (.text+0x100): > undefined referenc
64 2024-04-22
编程技术问答社区
如何检测当前进程中动态链接库(共享对象)的大小?
我们可以使用 我对类似Unix的平台(包括Linux,MacOS,iOS,Android等)了解不足.我该如何在这些平台上进行相同的操作? dladdr 不返回大小信息. 解决方案 可以从地址获得动态库的基础和大小. 打开/proc/$$/maps并对其进行解析,并将范围与您拥有的地址匹配.第一行是"基础地址",最后一列是库文件名,您可以fstat() on并获取大小. 其他解决方案 我对类似Unix的平台(包括Linux,MacOS,iOS,Android等)都不了解. 每个都可能需要不同的解决方案. 使用尺寸信息,程序可以构建地址空间的细分树.一些模块信息可以在段树中缓存,并且可以将回溯中的绝对地址有效地转换为相对地址. 请注意,由于ASLR,"细分树"仅适用于当前过程(以及任何孩子fork() s) - 与Windows不同,共享库的位置(以及可能的主要可执行文件)将从运行到跑步. 在Linux(和当前版本的Android)上
20 2024-04-22
编程技术问答社区
Gcc 隐藏来自所含静态库的符号的可见性
我有: 一个共享库,例如 libshared.so ,其中包含一个类Bar,带有方法int Bar::do(int d) const 一个静态库,例如 libstatic.a ,其中包含一个类Foo的int Foo::act(int a) const. Bar的代码是这样的: //Bar.h class __attribute__ ((visibility ("default"))) Bar { private: __attribute__ ((visibility ("hidden"))) int privateMethod(int x) const; public: Bar() {} int do(int d) const; } //Bar.cpp #include "Bar.h" #include "Foo.h" int Bar::do(int d) const { Foo foo; int result = f
14 2024-04-22
编程技术问答社区
GCC 不同优化级别的不同输出
我正在研究上学期我为大学开发的射线跟踪器的重写,我遇到了以下问题: 当我在调试中编译并运行代码时,输​​出为预期 但是,当我启用更高的优化水平时,例如" -o2"是完全不同的结果: 我不确定为什么会发生这种情况.我将其跟踪到Sphere交点代码 //#pragma GCC push_options //#pragma GCC optimize("O0") Intersection Sphere::intersect(const Ray& ray, const float previous) const { const auto oc = ray.origin - center_; const auto lhv = -dot(ray.direction, oc); const auto discriminant = lhv * lhv - (oc.lensqr() - radius_ * radius_); if (discrimina
30 2024-04-22
编程技术问答社区
从C#/NET引用一个在GCC中针对Cygwin构建的GNU C(POSIX)DLL
这是我想要的:我有一个为Posix编写的巨大的旧版C/C ++代码库,其中包括一些非常特定的特定内容,例如Pthreads.这可以在Cygwin/GCC上编译,并在Windows下用Cygwin dll运行. 我想做的是将代码库本身构建到Windows DLL中,然后我可以从C#引用C#并在其周围编写包装器以编程访问其某些部分. 我已经尝试了这种方法,以非常简单的" Hello world"示例,请#include extern "C" __declspec(dllexport) int hello(); int hello() { printf ("Hello World!\n"); return 42; } 我相信我应该能够使用以下内容来参考C#中的上述代码构建的DLL: [DllImport("kernel32.dll")] public static extern IntPtr LoadLibrary(string dllToLoad)
10 2024-04-11
编程技术问答社区
if-else if 梯子和编译器优化
以下哪个代码将更优化效率第一个函数或第二函数在C/C ++ GCC编译器中? // First Function if ( A && B && C ) { UpdateData(); } else if ( A && B ){ ResetData(); } //Second Function if ( A && B) { if (C) { UpdateData(); } else { ResetData(); } } 我们在第二功能中是否有任何性能提高? 如果使用了第一个功能,可以单独使用编译器将其优化为第二种方法? ? 解决方案 这个问题的很大一部分将取决于A,B和C的确是什么(编译器将优化它,如下所示).简单的类型,绝对不必担心.如果它们是某种"大型数学"对象,或者某些需要1000个指令的复杂数据类型是true>是否",那么编译器决定制作不同的代码,将会有很大的区别. 一如既往地在性
14 2024-04-10
编程技术问答社区
在Makefiles GCC C程序中,什么是.d文件,还有什么是通配符?
在Makefiles GCC C程序中,.D文件是什么,以及什么是通配符.? rgds, 解决方案 这些*.d通常(通常是常规的)是make依赖项(但也许,并且不太可能, d - 语言源代码). gcc 编译器知道-M(及相关) preprocessor option ,要求make> .... 而不是输出预处理结果,而是输出适合描述主源文件依赖项的规则. 在一些好的Makefile技巧的帮助下,您可以自动编写Makefile自动处理依赖项,例如 之类的东西 ## dependencies of foo.c foo.d: foo.c $(COMPILE.c) -M $^ -o $@ ## include them -include foo.d 关于$(wildcard *.c),阅读 gnu ,一节在文件名称函数.所以$(wildcard *.c)是 globbing *.c *.c make make将其扩展到以.c结尾的文件
18 2024-04-10
编程技术问答社区
l值需要作为条件运算符中赋值的左边操作数
#include int main() { int a = 1, b; a ? b = 3 : b = 4; printf("%d, %d", a, b); return 0; } [user@localhost programs]$ gcc -Wall vol.c vol.c: In function ‘main’: vol.c:5:16: error: lvalue required as left operand of assignment a ? b = 3 : b = 4; ^ 我以b的方式给出了lvalue,为什么gcc显示错误以及如何修复? 解决方案 它与操作员测序有关.编译器认为您正在做的是 (a ? b = 3 : b) = 4 显然是不正确的. 相反,为什么不将b放在左侧,而仅获得使用条件表达式的分配的值,例如 b
16 2024-04-10
编程技术问答社区
改变gcc/g++版本导致segfault
似乎将我使用的GCC版本从gcc 4.7.3更改为gcc 4.9.2会导致我的项目的segfault(清洁构建和运行后). 在不幸的事件转折中gdb在服务器上损坏了我 遇到此错误,目前无法使用.海湾合作委员会本身的任何已知变化可能会引起这一点?我怀疑这个问题可能是由双人免费引起的. 解决方案 您应该尝试使用Valgrind. valgrind是一种调试工具,仅需要使用-G标志编译代码.这是在程序上发现细分故障或任何内存泄漏的最佳方法. 考虑在调试时使用Valgrind选项(它在Valgrind报告的底部),例如Leak-Checkfull(我现在无法运行Valgrind,所以我无法确切告诉您它是什么). 但是,每当我编译代码时,我都会使用valgrind和它检查所有可能的故障.为了更简单,考虑甚至将VG放入Makefile规则中.
18 2024-04-10
编程技术问答社区
不能用gcc使用全局变量
我有这样的文件: char* vidmem = (char*)0xb8000; int main() { vidmem[0] = 'x'; vidmem[1] = 0x0f; } 但是,当我使用GCC编译时,它的行为就像Vidmem甚至不存在.我有一个问题,所有变量都在功能之外声明. Maby可以在Main内部声明这个,但是与此链接的其他文件中的其他变量不能. 这是我编译的方式: gcc -c main.c -o main.obj -ffreestanding -fno-exceptions -m64 这就是我组装所有文件的方式: gcc -m64 -Wl,--build-id=none -static -fno-asynchronous-unwind-tables -nostdlib -nodefaultlibs -lgcc main.obj [..] -T linker.ld -o out.bin 为什么会发生这种情况?我该如何解决?
12 2024-04-10
编程技术问答社区
在函数main中:对exec的未定义引用
我遇到此页面 我做了这个文件 #include int main(void) { exec("ls"); return 0; } 但是,它会给我这个消息 $ cc foo.c undefined reference to `exec' 该页面只是虚假的吗?过时?这里发生了什么? 解决方案 页面不是伪造的.但是,根据提供的链接实际上是Java,是Java,是Java站点是指imagej程序,即"图像处理和分析"应用程序.参见在这里. 其他解决方案 您需要使用" Exec"功能的一个家庭之一.即: 之一 int execl(const char *path, const char *arg, ...); int execlp(const char *file, const char *arg, ...); int execle(const char *path, const char *arg,..., char * c
12 2024-04-10
编程技术问答社区
错误:从'void*'到'int'的转换失去了精度[-fpermissive]在makefile中。
在ubuntu上编译以下makefile 12.04 LTS(64位)遇到此错误时: Ana.cxx:21:46: error: cast from ‘void*’ to ‘int’ loses precision [-fpermissive] 在此行中: 21 : TThread::Printf("Start of Ana %x \n" ,(int)ptr); 这是makefile: ObjSuf = o SrcSuf = cxx DllSuf = so ExeSuf = OutPutOpt = -o CXXFLAGS = -g -Wall -fPIC -DOSF1 CXX = g++ CCFLAGS = -g -Wall -DOSF1 CC = gcc LD = g++ LDFLAGS = -
14 2024-04-10
编程技术问答社区
当用-O选项编译时,无法写入LD链接器脚本中定义的变量
我正在编写一个程序来运行裸金属.我正在尝试从自定义链接器脚本中写入变量.使用-O0选项编译时,该代码可完美运行,但使用-os选项编译时不预期. 我使用的代码如下. main.c: #define TTB_BASE (&Image$$TTB) extern unsigned int Image$$TTB; int main () { *TTB_BASE = 56326; unsigned int *ttb=TTB_BASE+16; for (int i = 0; i
20 2024-04-10
编程技术问答社区
设置Linux-C-DB2环境
我正在尝试设置学习环境:编写和测试简单的C程序,以在Ubuntu 18.04上执行DB2数据库操作.系统. 我在Web教程和IBM页面的帮助下安装了DB2,从安装程序接收到数据库信息,在GEDIT中写了简单的程序. 我用GNU C编译器(GCC)编辑了最简单的程序. 编译器遇到" Exec sql ..."行终止并报告了错误. 使这件事起作用的下一步是什么? 解决方案 您还可以从IBM提供的示例嵌入式SQL程序(默认情况下)在Linux上提供的DB2. 这些在实例所有者主目录的样本子目录中(例如/home/db2inst1/samples/c. 在"样本目录"中,有许多其他编程语言的子目录可以显示如何使用DB2使用它们. 包含C程序嵌入式SQL的文件具有扩展名.sqc. 有一个很长的读数,有些脚本向您展示了如何编译和构建这些程序,展示了如何使用SQL预处理器等. 您还可以在DB2的免费知识中心中在线查看样本,例如v11.1 C
20 2024-04-10
编程技术问答社区
使用malloc的gcc内存对齐
我有以下结构: #define M 3 #pragma pack(push) #pragma pack(1) struct my_btree_node { struct my_btree_node *pointers[M]; unsigned char *keys[M - 1]; int data[M - 1]; unsigned char number_of_keys; }; #pragma pack(pop) sizeof(struct my_btree_node)函数为此结构返回49个字节的值.使用malloc返回64个字节块为该结构分配内存是因为在64位系统指示器上是16字节对准的,还是确实是49个字节? 是否有一种方法可以使内存的功率比两个小于16的较小的功率对齐,并且可以在应用程序内部获得分配的内存的真实大小吗? 我想减少填充字节的数量以节省内存.我的应用程序分配了数百万个结构,我不想浪费内存. 解决方案 mal
18 2024-04-10
编程技术问答社区
在WINDOWS/LINUX上巨大的浮动/双倍数的整数位数差异的printf
#include #include int main(int argc, char** argv) { printf("[0] %f\n", FLT_MAX); printf("[1] %lf\n", FLT_MAX); printf("[2] %Lf\n", FLT_MAX); // gcc warning: expects argument of type ‘long double’ printf("[3] %f\n", DBL_MAX); printf("[4] %lf\n", DBL_MAX); printf("[5] %Lf\n", DBL_MAX); // gcc warning: expects argument of type ‘long double’ //using C++ und std::numeric_limits::max()
10 2024-04-10
编程技术问答社区
在linux上安装gcc
如何在CentOS或科学Linux操作系统上安装GCC版本4.8版,该操作系统需要百胜才能安装. 我尝试从 是否有某种方法可以使用YUM安装在Linux上安装GCC版本4.8 我尝试了: 1).我尝试使用yum --enablerepo=testing-2-devtools-6 install devtoolset-2-gcc devtoolset-2-gcc-c++它给我存储库找不到 2). yum group install "Development Tools".它给了我软件包gcc-4.4.7-11.el6.x86_64已经安装了,最新版本 3).从头开始构建它,首先必须执行./contrib/download_prerequises才能在GCC源树中获取MPFR,GMP和MPC,然后制作一个单独的目录并运行/路径/TO/GCC/source/configure. 它给出: configure:error:在树上建造,但是/home/softwar
18 2024-04-10
编程技术问答社区
为什么scanf对大的浮点数采取错误的输入?
#include int main() { float k; scanf("%f", &k); printf("%f", k); } 在这个简单的程序中,当我输入一个最多包含8位数字的数字时,它被正确显示. ,如果我超过8位数字,即输入123456789输出为123456792. 为什么会发生这种情况?好吧,有趣的是,如果我在123456789和123456796之间输入任何数字,那么它总是显示123456792. 它是否与浮动数的8个小数精度有关? 解决方案 浮点类型的精度有限.对于您的机器上的float,似乎是32位,它具有24位精确度(23个解释存储,暗示1).这意味着整数大于〜16000000,这些整数需要超过24位才能存储,但该数据类型不能准确表示. 例如,您使用的值123456789具有: 的二进制表示形式 111 0101 1011 1100 1101 0001 0101 此值占据了27位
20 2024-04-10
编程技术问答社区
无法配置C语言编译器
我试图使用 gcc 4.7 编译一些库(我刚刚从4.6.3升级,以某种方式抱怨C编译器: /home/rtbkit/platform-deps/node/wscript:263: error: could not configure a c compiler! make[1]: Entering directory `/home/rtbkit/platform-deps/node' Project not configured (run 'waf configure' first) make[1]: *** [program] Error 1 make[1]: Target `all' not remade because of errors. make[1]: Leaving directory `/home/rtbkit/platform-deps/node' make[1]: Entering directory `/home/rtbkit/platform-deps/nod
16 2024-04-10
编程技术问答社区