小编Cha*_*son的帖子

如何表示地图文件依赖于add_executable?

我正在使用标准命令构建可执行文件:

add_executable(MyExe ac bc)

我正在调整CMAKE_EXE_LINKER_FLAGS以发出一个地图文件,它可以正常工作.

但是,如果删除映射文件,则执行增量构建不会重新生成映射文件.这是有道理的,因为我没有表达过cmake地图文件依赖于MyExe.在上面的场景中,MyExe.map甚至不是目标,因此cmake甚至不知道它存在.

我已经尝试创建自定义目标,但我无法创建重新生成映射文件的自定义命令,因为它来自add_executable.然后我尝试使用add_dependencies(),但这似乎只影响构建顺序.

我可以显式地重新运行链接器作为构建自定义目标的自定义命令,但这似乎很浪费,因为链接确实需要一些时间.

几乎看起来我需要一些方法来告诉add_executable除了可执行映像之外还有更多的输出.有没有办法做到这一点?

如果有人能指出我正确的方向,我会很感激!提前感谢您的阅读.

cmake map-files

14
推荐指数
1
解决办法
2218
查看次数

Bash 一句“如果文件存在,将其读入变量,否则为空字符串”?

我可以写:

X=""
if [ -f foo.txt ]; then
  X=$(<foo.txt)
fi
Run Code Online (Sandbox Code Playgroud)

但这是4行。有没有更简洁的方式来表达这个逻辑?

bash

5
推荐指数
1
解决办法
1371
查看次数

Xcode 3.1.1和静态库

我是一位经验丰富的VS.NET用户,并尝试在Xcode 3.1.1上运行.
这就是我想要完成的事情:

我想要一个静态库("Lib")拥有自己的xcodeproj文件.我有一个可执行应用程序("App"),它利用Lib来引用Lib的xcodeproj文件,这样对Lib的更改会导致App重新链接.理想情况下,我希望能够在App的Xcode工作区内编辑Lib的源文件,这样我就不必一直在进行任务来进行更改.

我从在线帮助中发现,我可以简单地将静态lib xcodeproj拖到我的应用程序项目中,然后获取引用.我看到,一旦我的静态lib xcodeproj在我的应用程序的项目中,我可以简单地将其拖到App的目标,它理解App依赖于Lib.这似乎是正确的道路,但事情并没有像我想象的那样发挥作用.

这是我的问题:

  1. 看起来简单地让App依赖于Lib并不会导致App与Lib链接.看来我必须将LibLib.a从Lib文件夹中显式拖到App的"Link Binary With Libraries"构建阶段.在VS.NET中,只需将项目指定为解决方案依赖项即可将其添加到链接行.我只是想确保我没有遗漏任何东西.

  2. 当我在Xcode中打开App并将Lib.xcodeproj拖入其中时,我没有得到任何Lib的源文件.我只在"Lib.xcodeproj"文件夹下获得libLib.a.在VS.NET中,我可以在那里编辑Lib的源文件并重建它等等......但是在Xcode中使用这种方法,在重建App时,对Lib.cpp的更改不会导致Lib重建.理想情况下,当我将Lib.xcodeproj拖到App中时,我会得到所有Lib的源文件和目标.有没有办法做到这一点?

在此先感谢任何回复!

macos xcode

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

是否允许优化编译器省略在短路中间接使用的函数调用?

C 和 C++ 语言按从左到右的顺序计算||&&,如果左侧确定整个表达式的真值,则必须“短路”右侧。

foo()如果 的结果foo()存储在仅在短路运算符右侧使用的局部变量中,两种语言是否都允许生成的代码不调用?

在下面的示例中,为 生成的代码bar()必须发出对 的调用foo()。编译时baz(),可以一个符合的优化编译器中删除的调用foo(),因为x在编译时是已知的?

int foo(int f);

int bar(int x) {
  int const foo_value = foo(x);
  if (x || foo_value) {
    return 123;
  }
  return 456;
}

int baz(/* assume "void" here for C */) {
  return bar(1); // Can this collapse down to "return 123"?
}
Run Code Online (Sandbox Code Playgroud)

c c++

4
推荐指数
1
解决办法
163
查看次数

x64 参数和返回值调用约定

我调用 Clang 12.0.0 来-Os -march=haswell编译以下 C 程序:

int bar(int);

int foo(int x) {
  const int b = bar(x);
  if (x || b) {
      return 123;
  }
  return 456;
}
Run Code Online (Sandbox Code Playgroud)

生成以下程序集:

foo:                                    # @foo
        push    rbx
        mov     ebx, edi
        call    bar
        or      eax, ebx
        mov     ecx, 456
        mov     eax, 123
        cmove   eax, ecx
        pop     rbx
        ret
Run Code Online (Sandbox Code Playgroud)

https://gcc.godbolt.org/z/WsGoM56Ez

据我了解,foo 的调用者在 RAX/EAX 中设置了 x。然后 foo 调用 bar,这不需要修改 RAX/EAX,因为 x 是作为未修改的输入传递的。

or eax, ebx指令似乎是将输入 x 与 bar 的结果进行比较。该结果如何最终进入 EBX?有何目的mov …

c assembly x86-64 calling-convention

4
推荐指数
1
解决办法
1552
查看次数

我如何告诉Bazel Python.h的位置?

我正在构建一个C++可执行文件,需要从用户的Python安装中#include"Python.h".

要在Bazel中表达Python.h(以及它包含的各种头文件),我需要知道Python包含目录的位置.这个位置在Windows和Linux上会有所不同,我想要一个Bazel配置来构建它们.

用于引用WORKSPACE根目录之外的软件的最佳Bazel实践是什么?

bazel

3
推荐指数
1
解决办法
988
查看次数

编译器是否需要将存储发送到原始地址?

两种流行的编译器(gcc、clang)在以下函数体中发出存储指令:

void foo(char x) {
  *(char *)0xE0000000 = x;
}
Run Code Online (Sandbox Code Playgroud)

该程序可能在某些硬件架构上正常运行,其中写入的地址是内存映射 IO。

由于此访问是通过未限定为的指针执行的volatile,因此编译器是否需要在此处发出存储?足够积极的优化器可以合法地消除这个存储吗?我很好奇这个存储是否对抽象机构成了可观察到的副作用。

另外,C17 和 C++20 在这方面有什么不同吗?

c c++ compiler-optimization language-lawyer

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