gpt4 book ai didi

C项目: compiling multiple applications with shared sources

转载 作者:太空宇宙 更新时间:2023-11-04 02:13:11 25 4
gpt4 key购买 nike

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

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

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. 我应该为这样的事情使用 autotools 吗?查看示例后,我看不出如何链接共享代码或库。

非常感谢任何指导。

最佳答案

这是一种布局源代码树的合理方式,尽管您可能会考虑将源文件和头文件分开。如果您想构建一个库(如果许多应用程序使用 shared1),您可以为它编写一个规则,并将该规则放入 shared1/ 的 makefile 中。有多种方法可以使用这样的规则,但在您确定需要一个库之前不要担心。

路径是必要之恶。它们将 makefile 锁定到特定的目录布局,但您不能完全没有它们。您可以做的就是将它们集中起来:

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

您对依赖项的使用有点奇怪。一方面,最好从源列表中导出对象列表,因为您可能有一个没有 header 的源或一个没有源的 header :

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

其次,您使每个 目标文件都依赖于所有 header ,这可能有点矫枉过正。假设我们可以假设 foo.o 将依赖于 foo.h,并且 app2.o 依赖于 shared1.h;然后我们可以写一个更好的规则:

%.o: %.c %.h
$(CC) -c -o $@ $< $(CFLAGS)

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

如果您有很多对象并且这种方法太麻烦,可以使用一种非常复杂的方法来自动处理这些列表,但这是一种您最好不要尝试的高级技术.

最后,如果您发现您所有的应用程序 makefile 看起来很相似,您可以将所有通用的东西放在 project/ 中的 makefile 中

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

关于C项目: compiling multiple applications with shared sources,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11108979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com