小编Gab*_*ern的帖子

CMake可以使用g ++编译C文件吗?

我参与了一个项目,我使用g ++在以.c结尾的文件中编译C代码.原因是我被告知g ++有更好的警告信息.

我正在切换这个项目的构建过程以使用CMake.我发现最初CMake想用gcc来编译C文件.由于在使用时声明变量之类的事情,这失败了.所以我尝试使用g ++来编译C文件

set(CMAKE_C_COMPILER_INIT g++)
Run Code Online (Sandbox Code Playgroud)

在CMakeLists.txt文件中.但这会导致错误消息:

#error "The CMAKE_C_COMPILER is set to a C++ compiler"
Run Code Online (Sandbox Code Playgroud)

我一直在将.c文件重命名为.cpp来解决这个问题,因为这似乎是让我工作的最简单方法,也许也是最好的方法.但我想知道是否有可能迫使CMake使用g ++来编译C文件.

gcc g++ cmake

12
推荐指数
1
解决办法
2万
查看次数

为什么gdb会挂起?

我有一个应用程序,我正在调试,我试图了解gdb如何工作以及为什么我有时无法单步执行应用程序.我遇到的问题是,当我逐步执行程序时,gdb将挂起并且它所附加的进程将进入一个已不存在的状态.gdb挂起后,我必须杀死它以释放终端(ctrl-C不起作用,我必须通过获取该gdb会话的进程ID并使用kill -9从不同的终端窗口执行此操作).

我猜测gdb正在挂起,因为它正在等待应用程序在下一条指令处停止,并且某种程度上应用程序完成执行而没有gdb识别这一点.但这只是我迄今为止所观察到的行为的猜测.所以我的问题是,如果有人之前已经看过这种行为和/或可能会提出原因可能是什么.我认为这可能有助于我改进调试策略.

如果它很重要我正在使用g ++ 4.4.3,gdb 7.1,在Ubuntu 10.04 x86_64上运行.

linux gdb g++

11
推荐指数
2
解决办法
1万
查看次数

LLVM和Clang中的优化级别

我正在研究一个我用LLVM 2.6和llvm-gcc前端编译的项目.我正在尝试使用LLVM 3.1和clang来测试它.当我这样做时,我得到以下关于-O5优化级别的错误消息:

error: invalid value '5' in '-O5'
Run Code Online (Sandbox Code Playgroud)

但是,LLVM 2.6和llvm-gcc在-O5标志上运行良好.我看到了关于Clang优化级别的以下文档:

-O0 -O1 -O2 -Os -O3 -O4
       Specify which optimization level to use.  -O0 means "no optimization": this level compiles the
       fastest and generates the most debuggable code.  -O2 is a moderate level of optimization which
       enables most optimizations.  -Os is like -O2 with extra optimizations to reduce code size.  -O3
       is like -O2, except that it enables optimizations that take longer to perform or that may
       generate …
Run Code Online (Sandbox Code Playgroud)

llvm clang llvm-gcc

10
推荐指数
1
解决办法
2万
查看次数

如何确定C++类的大小?

简介:编译期间编译器如何静态地确定C++类的大小?

细节:

我试图了解规则用于确定类将使用多少内存,以及内存如何对齐.

例如,以下代码声明了4个类.前2个是16个字节.但是3是48个字节,即使它包含与前2个相同的数据成员.而第四个类具有与第三个相同的数据成员,只是以不同的顺序,但它是32个字节.

#include <xmmintrin.h>
#include <stdio.h>

class TestClass1 {
  __m128i vect;
};

class TestClass2 {
  char buf[8];
  char buf2[8];
};

class TestClass3 {
  char buf[8];
  __m128i vect;
  char buf2[8];
};

class TestClass4 {
  char buf[8];
  char buf2[8];
  __m128i vect;
};


TestClass1 *ptr1;
TestClass2 *ptr2;
TestClass3 *ptr3;
TestClass4 *ptr4;
int main() {
  ptr1 = new TestClass1();
  ptr2 = new TestClass2();
  ptr3 = new TestClass3();
  ptr4 = new TestClass4();
  printf("sizeof TestClass1 is: %lu\t TestClass2 is: %lu\t TestClass3 is: …
Run Code Online (Sandbox Code Playgroud)

c++ memory-alignment

10
推荐指数
2
解决办法
1万
查看次数

如何用clang替换llvm-ld?

摘要: llvm-ld已从LLVM 3.2版本中删除.我试图弄清楚如何在我的构建系统中使用clang.

请注意,我在编写代码时想出了我自己的问题的答案,但我仍然发布它,以防它对其他人有用.也欢迎其他答案.

细节:

我有一个构建过程,首先使用生成bitcode clang++ -emit-llvm.然后我拿bitcode文件并将它们链接在一起llvm-link.然后我应用一些标准的优化传递opt.然后我应用另一个自定义编译器传递opt.然后我再次使用opt第三次标准优化通道.最后,我从最后一次运行中获取输出,opt并使用llvm-link与适当的库链接来生成我的可执行文件.当我尝试在此过程中替换llvm-linkclang++,我收到错误消息:file not recognized: File format not recognized

为了使这个问题更加具体,我创建了一个简化的例子来说明我要做的事情.首先,我想要编译和链接在一起的两个文件

test1.cpp:

#include <stdio.h>

int getNum();

int main()
{
  int value = getNum();
  printf("value is %d\n", value);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

测试2.cpp

int getNum()
{
  return 5;
}
Run Code Online (Sandbox Code Playgroud)

我执行了以下命令序列:

clang++ -emit-llvm -c test1.cpp test2.cpp
llvm-link -o test.bc1 test1.o test2.o 
opt test.bc1 -o test.bc2 -std-compile-opts
Run Code Online (Sandbox Code Playgroud)

(请注意,我目前正在运行llvm …

llvm clang ld

9
推荐指数
1
解决办法
6263
查看次数

什么是C++预处理器输出中的<内置>?

简介:C++预处理器输出包含一些说明的行<built-in>.我很想知道它们的用途.

细节:

当我在一个文件名为编译下面的代码test.cppclang++ -E(输出g++是相似的):

#include <iostream>

int main()
{
  std::cout << "Hello World!" << std::endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

前几行输出如下:

#1"test.cpp"
#1"test.cpp"1
#1"<内置>"1
#1"<内置>"3
#156"<内置>"3
#1"<命令line>"1
#1"<内置>"2
#1"test.cpp"2

我的问题是这些<built-in>陈述是什么意思.

c++ c-preprocessor

9
推荐指数
1
解决办法
1264
查看次数

perf是否锁定配置文件用户空间互斥?

摘要:perf lock配置文件pthread_mutex?

细节:

该工具perf有一个选项perf lock.手册页说:

You can analyze various lock behaviours and statistics with this perf lock command.
   'perf lock record <command>' records lock events
    between start and end <command>. And this command
    produces the file "perf.data" which contains tracing
    results of lock events.

    'perf lock trace' shows raw lock events.

    'perf lock report' reports statistical data.
Run Code Online (Sandbox Code Playgroud)

但是当我试着跑步时,perf lock record我得到一个错误说:invalid or unsupported event: 'lock:lock_acquire'.我看了,似乎错误可能是因为我的内核没有编译CONFIG_LOCKDEPCONFIG_LOCK_STAT. …

linux perf

9
推荐指数
1
解决办法
3006
查看次数

了解glibc源代码约定

我一直在寻找glibc的一些源代码,特别是nptl代码,我发现它有点难以理解,因为它似乎有我不熟悉的约定.

例如,我正在查看一个非常小的文件pthread_equal.c,我有一些问题:

22 int
23 __pthread_equal (thread1, thread2)
24      pthread_t thread1;
25      pthread_t thread2;
26 {
27   return thread1 == thread2;
28 }
29 strong_alias (__pthread_equal, pthread_equal)
Run Code Online (Sandbox Code Playgroud)
  1. 第22和23行的声明看起来像我理解的东西.它的返回类型是int函数名__pthread_equal和参数列表(thread1, thread2).但第24 pthread_t thread1;和25 行的声明pthread_t thread2;是什么?看起来这些被声明为全局变量,但我不明白其目的.我在nptl目录中的许多文件中都看到过这种模式,并且无法弄清楚为什么会这样做.

  2. 什么是strong_alias?快速谷歌搜索有使用这个的例子,但我没有找到任何文档的链接.

  3. 什么是用作序两个下划线一些名字的原因__,有些用一个下划线_.我见过的大多数代码使用了两个下划线,但我想我已经看到了一些使用下划线的地方.例如在pthreadP.h中

    556 /* Old cleanup interfaces, still used in libc.so.  */
    557 extern void _pthread_cleanup_push (struct _pthread_cleanup_buffer *buffer,
    558                                    void (*routine) (void *), void *arg);
    559 extern void …
    Run Code Online (Sandbox Code Playgroud)

c pthreads libc

8
推荐指数
1
解决办法
1785
查看次数

共享内存和分布式内存的主要区别

关于共享内存分布式内存之间的区别,我有点困惑.你能澄清一下吗?

  1. 是一个处理器的共享内存和许多(网络)分布?

  2. 如果我们有共享内存,为什么我们需要分布式内存?

memory distributed shared cpu-architecture multiprocessing

7
推荐指数
2
解决办法
1万
查看次数

gdb 引用的“系统提供的 DSO”是什么?

我正在运行 gdb,并且set verbose on试图理解收到的消息之一:

Reading symbols from system-supplied DSO at 0x7ffff7ffb000...(no debugging symbols found)...done.
Run Code Online (Sandbox Code Playgroud)

是什么system-supplied DSO?经过一番搜索,我认为这DSO可能代表“动态共享对象”。但我仍然不明白 gdb 在这里做什么以及如何解决找不到调试符号的问题(或者如果它甚至很重要)。

另外,我正在调试的程序正在使用 llvm-gcc 进行编译,并应用了 LLVM pass。我认为这会影响 gdb 的行为,但我不确定如何影响。

所以本质上我的问题是 gdb 打印的消息意味着什么,它是否可能导致问题,如果是的话,有什么建议可以帮助 gdb 找到调试符号。

gdb llvm-gcc

6
推荐指数
1
解决办法
5638
查看次数