2010-04-06 102 views
1

我正在嘗試使用LLVM編譯c程序,並且遇到了一些包含靜態庫的問題。我已經使用LLVM成功編譯了這些靜態庫,例如,libogg.a也存在,就像ogg.l.bc一樣。不包含在生成的LLVM可執行文件中的靜態庫

但是,當我嘗試構建最終的程序時,它不包含靜態ogg庫。我已經試過各種編譯器選項最顯着的是:

gcc oggvorbis.c -O3 -Wall -I$OV_DIR/include -l$OV_DIR/lib/libogg.a -l$OV_DIR/lib/libvorbis.a -o test.exe 

這將導致下面的輸出(簡稱爲簡潔起見目錄):

$OV_DIR/include/vorbis/vorbisfile.h:75: warning: ‘OV_CALLBACKS_DEFAULT’ defined but not used 
$OV_DIR/include/vorbis/vorbisfile.h:82: warning: ‘OV_CALLBACKS_NOCLOSE’ defined but not used 
$OV_DIR/include/vorbis/vorbisfile.h:89: warning: ‘OV_CALLBACKS_STREAMONLY’ defined but not used 
$OV_DIR/include/vorbis/vorbisfile.h:96: warning: ‘OV_CALLBACKS_STREAMONLY_NOCLOSE’ defined but not used 
llvm-ld: warning: Cannot find library '$OV_DIR/lib/ogg.l.bc' 
llvm-ld: warning: Cannot find library '$OV_DIR/lib/vorbis.l.bc' 
WARNING: While resolving call to function 'main' arguments were dropped! 

我覺得這是令人費解,因爲$ OV_DIR/lib中/ ogg.l.bc確實存在,就像vorbis.l.bc一樣,它們都是可讀的(就像它們包含的目錄一樣)。

有沒有人有任何想法我做錯了什麼?

感謝,

馬特

回答

0

我不認爲-loption預期路徑。你應該分裂出來的那些,並使用-L選項設置的路徑,然後只使用普通的庫名與-l

$ gcc oggvorbis.c -O3 -Wall -I$OV_DIR/include -L$OV_DIR/lib -logg -lvorbis -o test.exe 

另外請注意,這樣在使用時,你不包括「LIB」和庫名稱的「.a」部分。

+0

感謝您的答覆。您可以使用帶-l選項的路徑。這迫使編譯器使用指定的文件而不是擴展-logg。這是因爲編譯器比靜態庫更喜歡動態共享庫。 無論哪種方式,它都不能解釋即使它們存在也無法找到字節碼l.bc文件的事實! – 2010-04-06 09:56:00

3

正如展開說的那樣, -l後面跟着庫名。

例如,在linux庫命名慣例, 如果庫命名爲libogg,

-logg會發現,選擇在圖書館目錄中的*最佳匹配。

您可以添加目錄到列表:

  1. -l選項的以下臨時文件夾添加到列表的方式之一。
  2. 環境變量LD_LIBRARY_PATH還會影響GNU工具在大多數Linux/Unix上的列表。

gcc可能會找到名稱與請求的庫名相匹配的靜態庫和共享庫文件。

例如,

libogg.a libogg。所以

這就是爲什麼有一個gcc的選項,-static

-static
在支持動態鏈接系統,這樣可以防止連接 與共享庫。在其他 系統上,此選項不起作用。

如果你只是想使用共享或靜態庫文件 - 直接,只是作爲一個目標文件,然後 給自己的路,沒有任何選項,如

gcc oggvorbis.c the_path/libogg.a 
+0

您可能想要閱讀gcc的手冊頁-l選項 – ddoman 2010-04-06 10:27:34

+0

感謝您的回覆。我將嘗試直接將靜態庫文件用作對象文件。 – 2010-04-06 11:30:20

相關問題