1

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

foo.h

#ifndef _FOO_H_
#define _FOO_H_

void foo();

#endif

foo.c

 #include<stdio.h>
 #include "include/foo.h"

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

 }

mainer.c

#include <stdio.h>
#include "include/foo.h"
int main()
{       foo();
        return 0;
}

为了这个程序的目的,头文件和静态库都需要在不同的文件夹中,所以头文件是打开/include/foo.h的,生成的静态库是打开的/lib/libfoo.a,两个.c程序都在主目录下。思路是先生成目标程序,然后生成静态库,再链接静态库创建可执行文件,最后执行程序。

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

$ gcc -c foo.c -o foo.o

$ ar rcs lib/libfoo.a foo.o

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

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

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

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

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

4

3 回答 3

2

更改-L.-Llib您在此处创建 .a 文件的样子。

于 2013-04-09T22:47:32.563 回答
1

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

gcc -static mainer.c -L./lib -lfoo -o mainfoo 
于 2013-04-09T22:47:18.820 回答
1

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

于 2013-04-09T22:48:12.973 回答