2

我正在启动一个具有多个应用程序的项目。这些应用程序在源文件方面共享一些通用功能。每个应用程序都应该有自己的 make 文件,但能够从一个公共位置链接这些共享源文件。

为了说明这一点,这是我的目录布局:

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 $@ $< $(CFLAGS)

app2: $(OBJ)
    $(CC) -o $@ $^ $(CFLAGS) $(LIBS)
  1. 这是管理共享源的大致正确方法,还是有更好的方法。它们应该是单独编译的库吗?如果是这样,怎么做?

  2. 这样的相对路径可以吗?

  3. 我应该使用自动工具来做这样的事情吗?查看示例后,我看不到如何链接共享代码或库。

非常感谢任何指导。

4

2 回答 2

2

这是布局源代码树的合理方式,尽管您可能会考虑将源文件和头文件分开。如果您想构建一个库(如果许多应用程序使用,例如shared1),您可以为它编写一个规则,并将该规则放在一个 makefile 中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.owill 取决于foo.h,并且也app2.o取决于shared1.h; 那么我们可以写一个更好的规则:

%.o: %.c %.h
    $(CC) -c -o $@ $< $(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 $@ $< $(CFLAGS)

app%: $(OBJ)
    $(CC) -o $@ $^ $(CFLAGS) $(LIBS)

然后应用程序的 makefile 可以如下所示:

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

app2:
include ../Makefile

XXXCFLAGS += -I$(SHARED1DIR)

app2.o: $(SHARED1DIR)/shared1.h
于 2012-06-19T21:13:05.510 回答
1

相对路径在项目中完全没问题...共享代码的一种更简单的方法是将头文件和库导出到一个公共位置,然后将驱动程序与它们链接起来。

这种方法在我的很多个人项目中使用,有时我使用 CMake,然后将所有应用程序目标链接到我自己的库。

于 2012-06-19T20:38:34.710 回答