关于C#:找不到静态库

Static library cannot be found

让我先解释一下上下文。我有一个带有函数声明的标头,带有函数主体的.c程序以及主程序。

foo.h

1
2
3
4
5
6
#ifndef _FOO_H_
#define _FOO_H_

void foo();

#endif

foo.c

1
2
3
4
5
6
7
8
9
 #include<stdio.h>
 #include"include/foo.h"

 void foo()
 {
     printf("Hello\
"
);

 }

mainer.c

1
2
3
4
5
6
#include <stdio.h>
#include"include/foo.h"
int main()
{       foo();
        return 0;
}

就本程序而言,标头和静态库都需要位于单独的文件夹中,因此标头位于/include/foo.h上,生成的静态库将位于/lib/libfoo.a上,而两个.c程序都位于主目录。这个想法是先生成目标程序,然后生成静态库,然后链接静态库以创建可执行文件,最后执行程序。

在创建目标程序和静态库时都没有问题。

1
2
3
$ gcc -c foo.c -o foo.o

$ ar rcs lib/libfoo.a foo.o

但是当我尝试链接静态库时...

1
$ gcc -static mainer.c -L. -lfoo -o mainfoo

它给了我一个错误,声称找不到静态库

1
2
/usr/bin/ld: cannot find -lfoo
collect2: ld returned 1 exit status

这很奇怪,考虑到我之前问过如何使用静态库和单独文件夹上的标头,在这种情况下,找到了静态库。知道我在做什么错吗?


-L.更改为-Llib,就像在其中创建.a文件一样。


基本上,链接器告诉您找不到库foo。通常,它会在默认库目录中搜索使用-L选项提供的任何内容。您要告诉它在当前目录中查找,而不是在libfoo.a所在的lib中查找,这就是为什么它找不到它的原因。您需要将-L.更改为-Llib


我不能完全确定我了解您的目录结构,但是也许您需要的是:

1
gcc -static mainer.c -L./lib -lfoo -o mainfoo