2013-04-09 90 views
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 

这gaves给我一个错误,声称静态库无法找到

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

它奇怪,考虑I asked before how to work with static libraries and headers on separate folders and in this case the static libraries were found。任何想法我做错了什么?

+1

它在'lib'不''' – 2013-04-09 22:46:28

回答

1

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

1

我不能完全肯定,我理解你的目录结构,但也许你需要的是这样的:

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

别担心,你说得对。并且您的代码有效;) – SealCuadrado 2013-04-09 22:57:09

2

变化-L.-Llib因为它看起来像您所创建的某文件存在。

+0

我不是编译与子目录关联的程序的专家,但使用-Llib与-L./lib相比有什么优势吗? (我不想被误会,两个答案都能解决问题,但无论如何我都想知道)。 – SealCuadrado 2013-04-09 22:55:09

+0

-Llib更干净,因为我的答案中的“./”只是冗余信息。 – Mikkel 2013-04-09 22:58:12