2015-04-20 138 views
2

我試圖編譯在Linux的簡單cprogram與共享庫編譯一個cprogram在Linux中使用共享庫

我都在同一個文件夾中。

我有TE下列文件:

mymain.c

#include "myclib.h" 
int main() { 
    func(); 
    return 0; 
} 

myclib.h

void func(); 

myclib.c

​​

然後我遵循下列步驟:

  • GCC -c子卡myclib.c(創建memoryaddress獨立objectfile)

    其產生:myclib.o

  • GCC -shared -fPIC -o libmyclib.so myclib.o(創建共享庫)

  • gcc -c mymain.c(在main.c中創建目標文件)

到目前爲止好 - 然後我有以下文件準備就緒:

main.o libmyclib.so

,所以我嘗試創建一個程序出這個語法:

gcc -o program -lmyclib -L。 mymain.o

(我猜從libmyclib前綴lib應該有l替代?)

但我從GC-編譯器錯誤消息:

*mymain.o: In function `main': 
mymain.c:(.text+0xa): undefined reference to `func' 
collect2: error: ld returned 1 exit status* 

我有作爲經過充分測試的語法如下:

gcc -o program mymain.c -L -lmyclib -Wl,-rpath ,.

然後我得到以下錯誤:

/usr/bin/ld: cannot find -lmyclib.so 
collect2: error: ld returned 1 exit status 

所以我的問題 - 我到底在這兩種實現做錯了什麼? 如何使用共享庫將此程序編譯爲可執行文件?

在此先感謝

+0

變化'gcc的-o程序-lmyclib -L。 mymain.o'到'gcc -o program mymain.o -lmyclib -L.' –

+0

@PaulR'-k'選項需要最後一個。 – fuz

+0

@FUZxxl:我不這麼認爲(假設你的意思是'-L'?) - 參見:http://stackoverflow.com/questions/5817269/does-the-order-of-l-and-l-options -in-the-gnu-linker-matter –

回答

4

您需要將有關鏈接調用命令行的末尾-l選項:

gcc -o program -L. mymain.o -lmyclib 
+0

謝謝它的作品!但現在當我用./program執行程序時,我收到錯誤消息:加載共享庫時出現錯誤:libmyclib.so:無法打開共享對象文件:沒有這樣的文件或目錄**。但我會在幾分鐘內接受這個答案:-) – java

+0

您不需要更改LD_PRELOAD以加載位於預定義目錄之外的共享對象嗎? –

+0

是的 - 我想它看起來在usr/lib或什麼? – java