Tag: gcc

为什么内部结构中不允许使用typedef?

我有一个程序,在现有的typedef结构中定义一个typedef结构,我想知道为什么我得到一个编译错误。 这是程序: typedef struct Outer { typedef struct Inner { int b; }INNER; INNER inner; int a; }OUTER; int main() { OUTER obj; obj.a = 10; obj.inner.b=8; return 0; } 在编译时给出以下错误:: test.c:3:5: error:expected specifier-qualifier-list before ‘typedef’ test.c: In function ‘main’: test.c:17:5: error: ‘OUTER’ has no member named ‘a’ test.c:18:5: error: ‘OUTER’ has no member named […]

为什么我们需要围绕块宏的括号?

在linux中, container_of宏被包含在看似“额外”的括号中: #define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__mptr = (ptr); (type *)( (char *)__mptr – offsetof(type,member) );}) 而不是它,我们可以使用 #define container_of(ptr, type, member) { \ const typeof( ((type *)0)->member ) *__mptr = (ptr); (type *)( (char *)__mptr – offsetof(type,member) );} ? 括号是强制性的还是只是为了预防?

为什么我们在编译期间需要共享库

为什么在可执行文件的编译期间我们需要共享库的存在? 我的理由是,由于共享库未包含在我的可执行文件中并且在运行时加载,因此在编译期间不应该需要它。 或者我错过了什么? #include int addNumbers(int, int); //prototype should be enough, no? int main(int argc, char* argv[]){ int sum = addNumbers(1,2); printf(“sum is %d\n”, sum); return 0; } 我在我当前的目录中有libfoo.so ,但我将其名称更改为libfar.so ,以便在编译时发现需要共享库,或者它不能编译。 gcc -o main main.c -L. -lfoo gcc -o main main.c -L. -lfoo给main.c:(.text+0x28): undefiend reference to ‘addNumber’ 我认为只有共享库的名称才足够。 不需要共享库本身,因为它位于LD_LIBRARY_PATH中并在运行时动态加载。 除了共享库的名称之外还需要其他东西吗?

gcc的__builtin_cpu_supports检查OS支持吗?

GCC编译器提供了一组内置函数来测试某些处理器function,例如某些指令集的可用性。 但是,根据这个线程,我们也可能知道操作系统可能无法启用某些cpufunction。 所以问题是: __builtin_cpu_supports intrinsics还检查操作系统是否启用了某些处理器function?

使用GCC C处理AIX上的空指针

我们有一个用C编写的代码,有时候不能很好地处理零指针。 该代码最初是在Solaris上编写的,这样的指针会导致分段错误。 不理想,但比耕作更好。 我们的经验是,如果从AIX上的空指针读取,则得到0.如果使用xlc编译器,则可以添加选项-qcheck=all来捕获这些指针。 但我们使用gcc(并希望继续使用该编译器)。 gcc提供这样的选择吗?

OpenMP和C并行for循环:为什么我的代码在使用OpenMP时会变慢?

我是新来的,是C语言的初级程序员。我在使用openmp来加速for循环方面遇到了一些问题。 以下是简单的例子: #include #include #include #include gsl_rng *rng; main() { int i, M=100000000; double tmp; /* initialize RNG */ gsl_rng_env_setup(); rng = gsl_rng_alloc (gsl_rng_taus); gsl_rng_set (rng,(unsigned long int)791526599); // option 1: parallel #pragma omp parallel for default(shared) private( i, tmp ) schedule(dynamic) for(i=0;i<=M-1;i++){ tmp=gsl_ran_gamma_mt(rng, 4, 1./3 ); } // option 2: sequential for(i=0;i<=M-1;i++){ tmp=gsl_ran_gamma_mt(rng, 4, […]

如何使用编译的C代码编译和链接C ++代码?

我希望能够使用Cmockery来模拟从我正在测试的C ++代码调用的C函数。 作为向前迈出的一步,我将Cmockery示例run_tests.c重命名为run_tests.cpp,并尝试编译并将其与cmockery.c链接: g++ -m32 -DHAVE_CONFIG_H -DPIC -I ../cmockery-0.1.2 -I /usr/include/malloc -c run_tests.cpp -o obj/run_tests.o gcc -m32 -DHAVE_CONFIG_H -DPIC -Wno-format -I ../cmockery-0.1.2 -I /usr/include/malloc -c ../cmockery-0.1.2/cmockery.c -o obj/cmockery.o g++ -m32 -o run_tests obj/run_tests.o obj/cmockery.o 前两个命令行(编译)是成功的,但在最后我得到: Undefined symbols: “_run_tests(UnitTest const*, unsigned long)”, referenced from: _main in run_tests.o ld: symbol(s) not found collect2: ld returned 1 exit […]

什么时候gcc __attribute __((构造函数))运行?

假设我有一个带有GCC构造函数的libA.so。 我的程序“程序”依赖于libA.so,所以当我运行它时,libA.so被打开并且它的构造函数被执行。 现在,我还有一个模块libC.so,它也依赖于libA。 我运行dlopen(“libC.so”) , 加载libC,并根据我的实验,也执行libA的构造函数 。 依赖关系看起来像这样: libA有构造函数 libB也有一个构造函数 libC依赖于libA和libB 程序取决于libA 程序通过dlopen()链接libC 现在,当我运行程序时: libA的构造函数在main()启动之前运行 libB的构造函数由dlopen()运行 显然,当它们被加载到内存中时,dlopen会执行库的构造函数。 这是在某处指定的,链接器如何检查哪些库已经加载? (为什么我要问:在一个场合,我有一个构造函数在一些不完全理解的情况下被执行了两次。我是否正确地假设这完全被打破并且在正常情况下不应该发生?)

如何编写C .so库来替换现有的C ++ .so库?

让我解释一下这个场景。 我们有一个遗留的C ++编译的.so库。 此库中的函数使用extern “c” {} ,因此C和C ++程序都可以使用该库,并且由于某种原因,它是使用–static-libgcc选项创建的。 这个旧图书馆很旧,很难维护。 现在我们已经设法编写了它的替代,但是用C语言编写。 假设旧库名为libfoo.so(旧),新库名为libfoo.so(新)。 对于给定的bar.o,它可以与旧的或新的libfoo.so链接以创建可执行文件,例如bar.exe。 但是bar.exe只能在它之前链接的同一个.so库中运行,换句话说,这两个库是不可互换的。 编辑#1 :我创建了一个名为libfoo.so的符号链接,指向libfoo.so(旧)或libfoo.so(新)。 此符号链接libfoo.so在运行时位于LD_LIBRARY_PATH中。 编辑#2 :当我将bar.o与旧的libfoo.so链接并生成bar.exe时,如果我使用新的libfoo.so运行此bar.exe,则会报告undefined symbols错误。 通过nm这两个libfoo.so,我可以在旧的符号中找到这些符号,但不能在新的符号中找到。 这些符号类似于_ZSt4cerr ,它是一个C ++ lib损坏的名称(我虽然它是由–static-libgcc引入的),当然新的libfoo.so不包含那些符号。 编辑#3 :如果我只是使用g ++而不是gcc编译和链接C代码,它是否有意义? 我该如何实现呢? 编辑#4 :今天我设法使用g ++(使用静态libgcc,静态libstdc ++)编译/链接新的C编程libfoo,这可能导致所有c ++符号都包含在libfoo.so中。 这可以使一切运行顺利,但不是我真正想要的。

错误的gcc生成的assembly顺序,导致性能损失

我有以下代码,它将数据从内存复制到DMA缓冲区: for (; likely(l > 0); l-=128) { __m256i m0 = _mm256_load_si256( (__m256i*) (src) ); __m256i m1 = _mm256_load_si256( (__m256i*) (src+32) ); __m256i m2 = _mm256_load_si256( (__m256i*) (src+64) ); __m256i m3 = _mm256_load_si256( (__m256i*) (src+96) ); _mm256_stream_si256( (__m256i *) (dst), m0 ); _mm256_stream_si256( (__m256i *) (dst+32), m1 ); _mm256_stream_si256( (__m256i *) (dst+64), m2 ); _mm256_stream_si256( […]