Tag: gcc

如何在AT&T语法中引用gcc内联汇编中的文字寄存器?

我试图引用寄存器文字; 我需要这个,因为我想使用像mulx这样的指令,这些指令要求其中一个输入位于rdx 。 我试过这个: #include int main() { uint64_t x = 15, y = 3, z, w; asm (“mov %[x], rdx\t\n” “mulx %[y], %[z], %[w]\t\n” : [z] “=&r” (z), [w] “=&r” (w) : [x] “r” (x), [y] “r” (y) : “rdx” ); return z + w; } 只适用于-masm=intel ,否则给出 $ gcc foo.c /tmp/ccGealWM.o:在函数`main’中: foo.c :(。text […]

避免#includes的预处理

我有一些C源,我想扩展#define宏(和#ifdefs等),但不是#includes 。 #includes应保持不变。 是否可以使用cpp(C预处理器)?

不满意的链接错误:java.library.path中没有库文件

我有这样的目录结构 . –compile_c.sh –compile_java.sh –config.sh –execute_java.sh –run.sh –src –ccode –jnitest_SimpleJNITest.h –rtm_simple.c –jnitest –SimpleJNITest.java –lib –rtm_simple.so –classes –SimpleJNITest.class 当它具有在rtm_simple.c充实的native方法时,如何正确运行rtm_simple.c ? 目前,我已定义 config.sh targetDir=”classes” libDir=”lib” srcDir=”src” MainPackage=”jnitest” Main=”SimpleJNITest” ccodeDir=”ccode” cFileName=”rtm_simple” jdkDir=”/home/user/local/java/jdk1.7.0_65″ mkdir -p “$targetDir” mkdir -p “$libDir” 我正试图跑 run.sh #!/bin/bash source compile_java.sh javah -d “${srcDir}/${ccodeDir}” -cp “$targetDir” -jni “${MainPackage}.${Main}” source compile_c.sh source execute_java.sh 哪里 compile_java.sh #!/bin/bash source […]

为什么ICC在x86上的汇编中产生“inc”而不是“add”?

在摆弄简单的C代码的同时,我发现了一些奇怪的东西。 为什么ICC在为增量生成的汇编代码中生成incl %eax而不是addl $1, %eax ? GCC的行为与预期的一样,使用add 。 示例代码(GCC和ICC上使用的-O3 ) int A, B, C, D, E; void foo() { A = B + 1; B = 0; C++; D++; D++; E += 2; } ICC的结果 L__routine_start_foo_0: foo: movl B(%rip), %eax #5.13 movl D(%rip), %edx #8.9 incl %eax #5.17 movl E(%rip), %ecx #10.9 addl $2, %edx […]

LLVM和GCC,不同的输出相同的代码

这是一个示例代码,仅用于显示LLVM编译器和GCC的不同输出。 我想知道为什么? 答案应该很简单,但我看不到它。 (Xcode 4.6.1) 代码: #include #define MAX(a,b) ( (a) > (b) ? (a) : (b) ) int increment() { static int i = 42; i += 5; printf(“increment returns %d\n”,i); return i; } int main( int argc, char ** argv ) { int x = 50; printf(“max of %d and %d is %d\n”, […]

gcc(6.1.0)在SSE内在函数中使用’错误’指令

背景 :我开发了一个用C / C ++编写的计算密集型工具,它必须能够在各种不同的x86_64处理器上运行。 为了加速浮点数和整数计算,代码包含了很多SSE *内在函数,它们具有针对不同CPU SSEfunction定制的不同路径。 (由于在程序开始时检测到CPU标志并用于设置布尔值,我假设对定制的代码块的分支预测将非常有效地工作)。 为简单起见,我假设只需要考虑SSE2到SSE4.2。 为了访问4.2路径的SSE4.2内在函数fpr,我需要使用gcc的-msse4.2选项。 问题我遇到的问题是,至少使用6.1.0,gcc使用sse4.2指令pinrd来实现sse2内部函数mm_cvtsi32_si128。 如果我使用-msse2限制编译,它将使用sse2指令,movd,即。 英特尔“内在指南”说它应该使用的那个。 这有点令人讨厌。 1)关键问题是,当程序在pre4.2 CPU上运行时,程序现在会因非法指令而崩溃。 我无法控制使用何种硬件,因此可执行文件需要与旧机器兼容,但需要利用新硬件上的function。 2)根据英特尔内在指南,pinrd指令比它取代的mov慢得多。 (pinsrd更通用但不需要这样)。 有谁知道如何使gcc 只使用内在指南所说的应该使用的指令,但仍然允许在同一个编译单元中通过SSE4 *访问所有SSE2? 更新:我还应该注意,在Linux,Windows和OSX下使用各种不同的编译器编译相同的代码,因此如果可能的话,更愿意避免或至少拥有最少的编译器特定扩展。 Update2 :(感谢@PeterCordes)似乎如果启用了优化,gcc将在适当的时候恢复使用来自pinsrd的movd。

GCC makefile不接受-std = c99 -lm

我用gcc编译器的makefile有问题。 如果我直接使用gcc: gcc -std=c99 -lm tm.c tm_coins.c tm_options.c tm_stock.c tm_utility.c -o tm -Wall -pedantic 一切正常。 我需要-std-c99和-lm。 但是,我被告知使用makefile。 这是我的make文件: CFLAGS=-ansi -Wall -pedantic LFLAGS=-std=c99 -lm CC=gcc all:tm tm:tm.o tm_coins.o tm_options.o tm_stock.o tm_utility.o $(CC) $(LFLAGS) tm.o tm_coins.o tm_options.o tm_stock.o tm_utility.o -o tm $(CFLAGS) tm.o: tm.h tm.c $(CC) $(LFLAGS) $(CFLAGS) -c tm.c tm_coins.o:tm_coins.h tm_coins.c $(CC) $(LFLAGS) $(CFLAGS) -c tm_coins.c […]

为什么找不到库,即使它们显然位于-L路径上?

我有以下链接命令(抱歉它的长度,但我试图尽可能保留原始,除了缩短一些路径): CC CMakeFiles / main.dir / main.cpp.o -o main -L / me / libs / cgal / lib -L ​​/ me / libs / tbb / tbb-2017_U7 / build / linux_intel64_gcc_cc5.3.0_libc2.19_kernel3.12.61_release -rdynamic -lmpfr -lgmp /me/libs/cgal/lib/libCGAL_ImageIO.a /me/libs/cgal/lib/libCGAL.a -lboost_thread -lboost_system -lz /me/libs/cgal/lib/libCGAL_ImageIO.a / me / libs /cgal/lib/libCGAL.a -lboost_thread -lboost_system -lz -ltbb -ltbbmalloc -Wl,-rpath,/ me / libs / […]

gcc链接订单问题

我目前在使用以下行编译时遇到问题: gcc test.c -I/usr/include -L/lib -lipc -lpcd -lrt -o /home/examples/bin/test 我被建议使用start-group和end-group对它们进行分组。 我无法获得正确的语法。 我想我需要这个部分,但整条线是什么样的? -Wl,–start-group -lipc -lpcd -lrt -Wl,–end-group

对我自己的库的未定义引用

我用几个创建了我的lib.a文件 gcc -c file.c -o file.o 然后 ar sr lib/libtest.a file1.o file2.o file3.o 确认 ar -t lib/libtest.a file1.o file2.o file3.o 但是当我尝试编译测试应用程序时 gcc lib/libtest.a test.c -o test 我在函数main得到了未定义的引用:来自file1.o,file2.o,file3.o的函数