2012-06-19 105 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,然后将所有应用程序目标与我自己的库链接。

相关问题