2012-06-19 45 views
1

我正在啓動一個具有多個應用程序的項目。這些應用程序在源文件方面共享一些通用功能。每個應用程序都應該有自己的make文件,但能夠從一個公共位置鏈接這些共享源文件。C項目:使用共享源代碼編譯多個應用程序

爲了說明這一點,這是我的目錄佈局:

project/ 
    lib/ 
     shared1/ 
      shared1.c 
      shared1.h 
     shared2/ 
      shared2.c 
      shared2.h 
    app1/ 
     app1.c 
     app1.h 
     makefile 
    app2/ 
     app2.c 
     app2.h 
     makefile 

目前的makefile一個看起來有點像這樣:

CC=gcc 
XXXCFLAGS=-Wall -Wextra -pedantic -I../../lib/shared1 
CFLAGS=-I. $(XXXCFLAGS) 
DEPS = app2.h ../../lib/shared1/shared1.h 
OBJ = ${DEPS:.h=.o} 
LIBS=-lpthread 

%.o: %.c $(DEPS) 
    $(CC) -c -o [email protected] $< $(CFLAGS) 

app2: $(OBJ) 
    $(CC) -o [email protected] $^ $(CFLAGS) $(LIBS) 
  1. 這是大概去了解正確的方式管理共享源碼,還是有更好的方法。他們應該分別編譯庫嗎?如果是這樣,怎麼樣?

  2. 像這樣的相對路徑好嗎?

  3. 我應該使用autotools來做這樣的事嗎?查看示例後,我看不到如何鏈接共享代碼或庫。

任何指導最受讚賞。

+0

除非你在編譯標誌或爲每個應用別的顯著的差異,我不知道你爲什麼會想每個應用有它自己的makefile。對我來說,你可以通過將它們全部放在一個makefile中來消除大量的重複位。 – twalberg

回答

2

儘管您可能會考慮將源文件和頭文件分開,但這是佈局源碼樹的合理方法。如果你想建立一個庫(如果有許多應用程序使用,比如說shared1),你可以爲它編寫一個規則,並將規則放在一個生成文件中,編號爲shared1/。有幾種方法可以使用這樣的規則,但在確定需要圖書館之前不要擔心。

路徑是一個必要的邪惡。他們將makefile鎖定到特定的目錄佈局,但是如果沒有它們,你不能完全做到。你可以要做的就是繼續他們什麼搶下:

SHARED1LIB = ../../lib/shared1 
XXXCFLAGS=-Wall -Wextra -pedantic -I$(SHARED1DIR) 
DEPS = app2.h $(SHARED1DIR)/shared1.h 

您使用的依賴是有點奇特。一方面,這是更好地從源列表導出對象列表,因爲你可能沒有報頭中的源或無源的頭:

SRCS = app2.c $(SHARED1DIR)/shared1.c 
OBJ = ${SRCS:.c=.o} 

其次,你讓對象文件取決於所有標題,這可能是矯枉過正。假設我們可以假設foo.o將取決於foo.h,並且app2.o取決於shared1.h;那麼我們可以寫一個更好的規則:

%.o: %.c %.h 
    $(CC) -c -o [email protected] $< $(CFLAGS) 

app2.o: $(SHARED1DIR)/shared1.h 

如果你有大量的對象,這方法太麻煩了,有一個自動處理這些名單一非常複雜的方法,但它是一種先進的技術,你'最好不要嘗試。

最後,如果你發現你所有的應用程序的makefile看起來相像,你可以把所有的共同的東西,並把它放在一個makefile中project/

SHARED1LIB = ../../lib/shared1 
SHARED2LIB = ../../lib/shared2 

CC=gcc 
XXXCFLAGS=-Wall -Wextra -pedantic 
CFLAGS=-I. $(XXXCFLAGS) 
OBJ = ${SRCS:.c=.o} 
LIBS=-lpthread 

%.o: %.c %.h 
    $(CC) -c -o [email protected] $< $(CFLAGS) 

app%: $(OBJ) 
    $(CC) -o [email protected] $^ $(CFLAGS) $(LIBS) 

然後應用程序生成文件可以是這樣的:

SRCS = app2.c $(SHARED1DIR)/shared1.c 

app2: 
include ../Makefile 

XXXCFLAGS += -I$(SHARED1DIR) 

app2.o: $(SHARED1DIR)/shared1.h 
+0

完美 - 這正是我尋找的答案 - 謝謝! – SlappyTheFish

1

相對路徑在項目中是完全可以的......分享代碼的更簡單方法之一就是將標題和庫導出到一個普通的地方,然後將驅動程序與它們連接起來。

這種方法用於我的許多個人項目中,有時我使用CMake,然後將所有應用程序目標與我自己的庫鏈接。

相關問題