2014-04-11 99 views
0

我正在嘗試構建一個應用程序,其中有兩個不同的系統彼此交互,其中大多數功能都很常見。所以我正在計劃一個像這樣的目錄結構。系統的Makefile文件

Xxx 
|_sys1 
| 
|_sys2 
| 
|_common 

每個都有一個單獨的include和src目錄。

從小小的瀏覽中瞭解到,保持編號爲libcmn.so的常見編碼效率很高,可以鏈接編譯xxxyyy

雖然我知道如何創建一個.so,但在帶有變量和鏈接頭文件的makefile中使用它們對我來說是新的。

有人可以指導我如何爲每個Makefile應該如何鏈接應該做一個正確的構建?

+0

您最好使用靜態庫而不是共享庫('.a'擴展名),避免修改'LD_PRELOAD'或'LD_LIBRARY_PATH'。 – Chnossos

+0

@Chnossos如果他把這些庫放在一個已知的位置(比如'/ usr/local/lib'),或者他將'-rpath'傳遞給鏈接器,他不一定要改變它們(假設'ld'在Linux上)。我寧願堅持動態庫,除非真的有一個強有力的理由去採用靜態方法。 –

回答

0

要編譯使用libcmn.so的xxx和yyy,它們只需包含庫接口頭文件。

要與庫鏈接只需添加一個-lcmn-Lpath/to/your/lib您LDFLAGS

要注意的是,使用這種方法,你將需要:

  • 添加庫路徑到LD_LIBRARY_PATH
  • 或將庫路徑添加到ldconfig
  • 或將庫移動到ldconfig看起來已經存在的位置(例如,/ usr/lib)

您還可以使用dlopendlsym函數在運行時將libcmn函數映射到函數指針。這將允許您指定要在運行時加載的庫的路徑和名稱,並避免LD_LIBRARY_PATH問題。

您將需要添加-ldl標誌使用這種技術

0

在化妝(1)控制文件進行編譯,順序是非常重要的。這是一般的規則:

Targets placed on the same prerequisites line may be build concurrently. Order is preserved between different <code>Makefile</code> targets. So something like this: 

all:: a b 

a:: a.o lib/libfoo.so 
    ${CC} ${LDFLAGS} -o [email protected] a.o -Llib -rpath=lib -lfoo.so ${LDLIBS} 

b:: b.o lib/libfoo.so 
    ${CC} ${LDFLAGS} -o [email protected] b.o -Llib -rpath=lib -lfoo.so ${LDLIBS} 

lib/libfoo.so: 
    ${MAKE} -C lib all 

現在,一個大的服務器上,你可以這樣做:

$ make -j10 all 

,一切都將建立在正確的順序。請確定lib目錄中有一個Makefile,該目錄知道如何構建庫。

除非libfoo.so顯着大,否則我會將其設置爲靜態庫,然後在運行時不必預先編程它的位置。