小编Pet*_* Wu的帖子

如何让conda中的ld找到libs

我正在尝试在 conda 环境下从源代码编译 minimap2(在此存储库中https://github.com/lh3/minimap2.git),c 编译器也是由 conda 安装的。它无法与 zlib 链接:

<conda_path>/bin/../lib/gcc/x86_64-conda_cos6-linux-gnu/7.3.0/../../../../x86_64-conda_cos6-linux-gnu/bin/ld: cannot find -lz
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

只需运行“<conda_path>/bin/x86_64-conda_cos6-linux-gnu-cc -lz”即可重现此错误

但如果运行“ld -lz --verbose”它可以工作

$ which ld
/usr/bin/ld
$ ld -lz --verbose
(sth not useful)
===
attempt to open //usr/x86_64-redhat-linux/lib64/libz.so failed
attempt to open //usr/x86_64-redhat-linux/lib64/libz.a failed
attempt to open //usr/lib64/libz.so succeeded
-lz (//usr/lib64/libz.so)
libc.so.6 needed by //usr/lib64/libz.so
found libc.so.6 at /usr/lib64//libc.so.6
ld-linux-x86-64.so.2 needed by /usr/lib64//libc.so.6
found ld-linux-x86-64.so.2 at /usr/lib64//ld-linux-x86-64.so.2
ld: warning: cannot find entry symbol _start; not …
Run Code Online (Sandbox Code Playgroud)

c c++ linux gcc conda

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

alloca() 如何与其他堆栈分配交互?

让我们从一个简单的堆栈分配示例开始:

void f() {
    int a, b;
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果我理解正确的话。a那么和的地址b与栈基址(即寄存器 )有固定的偏移量ebp。如果我们以后需要它们,这就是编译器找到它们的方式。

但请考虑以下代码。

void f(int n) {
    int a;
    alloca(n);
    int b;
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果编译器不做任何优化,堆栈将为a->n->b. 现在 的偏移量b取决于n。那么编译器做了什么?

模仿alloca() 在内存级别如何工作?。我尝试了以下代码:

#include <stdio.h>
#include <alloca.h>

void foo(int n)
{
    int a;
    int *b = alloca(n * sizeof(int));
    int c;
    printf("&a=%p, b=%p, &c=%p\n", (void *)&a, (void *)b, (void *)&c);
}

int main()
{
    foo(5);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是&a=0x7fffbab59d68, b=0x7fffbab59d30, …

c x86 alloca stack-frame

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

标签 统计

c ×2

alloca ×1

c++ ×1

conda ×1

gcc ×1

linux ×1

stack-frame ×1

x86 ×1