2013-04-09 132 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