2011-12-07 112 views
2

我試圖創建使用gcc
Ubuntu的共享庫我只是一個簡單的類(shared.h和shared.cpp)和一個客戶端使用它(main.cpp中)
這是我的makefile,我仍然無法讓程序編譯。GCC共享庫的問題

all: 
    #compile object(fPIC: creates position independent code) 
    gcc -fPIC -Wall -g -c shared.cpp 

    #compile shared library 
    gcc -shared -Wl,-soname,libshared.so.1 -o libshared.so.1.0.1 shared.o -lc 

    #link shared library 
    gcc -g -o main main.cpp -L. -lshared 
  • 我相信,第一行是正確
  • 我不確定什麼是 「-lc」 一樣。我認爲它傳遞給鏈接器的東西?
  • 我不想安裝庫,我只是想能夠從當前目錄鏈接它。我曾嘗試過:export LD_LIBRARY_PATH=.
    但它似乎沒有區別。一切都在當前目錄中。

    ERROR: /usr/bin/ld: cannot find -lshared

我怎麼讓編譯器檢查當前目錄爲我的圖書館嗎?

回答

4

的問題不在於它不看目錄,問題是,你命名的圖書館「libshared.so.1.0.1」。當您使用-lshared時,它正在庫搜索路徑中查找名爲'libshared.so'或'libshared.a'的文件。

大多數情況下,使用版本化系統庫時,即使已經安裝了「libshared.so.1」或「libshared.so」,您也會提供最新的鏈接爲'libshared.so'。 1.0.1' 。

在你的情況,如果你繼續留下名爲「libshared.so.1.0.1」的文件,你要創建2個符號鏈接:

  1. libshared.so - 使圖書館可以使用ld
  2. libshared.so.1 - 由於在構建它時將SO名稱聲明爲libshared.so.1,因此需要提供此鏈接,否則,可執行文件將無法找到正確的共享庫在運行時。
+0

謝謝。它發現它,我得到一堆未定義的引用。所以我認爲這是因爲我只有libshared.so而不是libshared.so.1錯誤: /tmp/ccZrfhqj.o:在函數'__static_initialization_and_destruction_0(int,int)'中: –

+1

@Xploit:由於您擁有正確的回答你爲什麼不接受它?你有0個被接受的答案(並且不是因爲你的問題沒有被正確回答)。 –

+0

@Serge Dundich,該網站的新用戶 - 謝謝。 請注意任何有此問題的人:確保您使用的是g ++而不是gcc –

0

您不寫任何依賴關係,這是Makefile -s的用途。你可能需要強制run path也許類似

.PHONY: all clean 
CXX=g++ 
CXXFLAGS=-g -Wall 
all: main 
main: main.o libshared.so 
     $(LINK.cpp) -o [email protected] $< -Wl,-rpath,. -L. -lshared 
libshared.so: shared.pic.o 
     $(LINK.cpp) -shared -o $^ $< 
main.o: main.cc shared.hh 
%.pic.o: %.cc 
     $(CXX) $(CXXFLAGS) -fPIC -c -o [email protected] $< 
# 
clean: 
     rm -f *.o *.so main *~ 
+0

哈哈,我知道我打破了禮節,但我只是希望它首先工作。 「-rpath」沒有這樣做,但這絕對是我需要添加的。它仍然有一個錯誤,說它無法在這裏找到它:/ usr/bin/ld –