5

我正在尝试使用 makefile 为我正在开发的 C++ 插件设置构建过程。我很想知道是否有任何方法可以使 g++ 编译在另一个目录中找到的文件。我这样做的动机是避免必须为每个源文件指定相对路径,如下所述。

我的项目目录结构如下:

MyPlugin --> src   --> Foo.cpp
                   --> Foo.h
                   --> Bar.cpp
                   --> Bar.cpp
         --> build --> Makefile

以下是我当前 Makefile 的精简版本:

SRC_PATH=../src
OUT_PATH=../bin
VPATH=${SRC_PATH}
FILES=Foo.cpp Bar.cpp

CC=g++
CFLAGS=-Wall -shared

all:
    mkdir -p ${OUT_PATH}
    ${CC} ${CFLAGS} -I${SRC_PATH} ${FILES} -o ${OUT_PATH}/MyPlugin.so

通过这样做,我试图避免FILES如下定义变量:

FILES=../src/Foo.cpp ../src/Bar.cpp

当我尝试运行时make all,g++ 给了我一个错误。看起来通过-Iflag 指定的路径仅用于搜索#included 文件。

g++: Foo.cpp: No such file or directory
g++: Bar.cpp: No such file or directory

我不能使用通配符 ( *.cpp),因为我并不总是希望提取所有文件进行编译。另一种选择是cdsrc 目录,如此处所述,然后从那里运行 g++,但这仅适用于所有文件都在同一目录中的情况(我需要输出为单个.so文件)。我也尝试设置环境变量PATH,但这似乎没有任何效果。

我查看了 g++ 帮助、make 文档,并查看了 StackOverflow 帖子,例如https://stackoverflow.com/questions/10010741/g-compile-with-codes-of-base-class-in-a-separate -directory and gcc/g++: "No such file or directory",但找不到我可以使用的任何解决方案。你能建议我一个合适的方法来解决这个问题吗?

编辑该示例可能具有误导性。在这个精简的示例中,我将所有源文件放在一个目录中,但在我的实际项目中,我有几个子目录,每个目录中有多个文件。因此,尽管在我上面的示例cd中对src目录有效,但它在我的实际项目中不起作用(或者至少,我想知道它是如何工作的)。

4

3 回答 3

7

您可以为实际的源文件设置第二个变量,如下所示:

FILES = Foo.cpp Bar.cpp
SOURCES = $(FILES:%.cpp=$(SRC_PATH)/%.cpp)

然后FILES在构建时使用而不是使用SOURCES.

于 2012-11-30T06:01:14.010 回答
1

您可以像这样将所有候选源目录放到 VPATH 中:

VPATH=${SRC_PATH}:other_source_dir1:other_source_dir2

然后当 g++ 需要源文件时,make 会沿着 VPATH 查找源文件。

并尝试将 .cc 文件列表更改为 .o 列表:

FILES = file1.o file2.o

并在您的 make 文件中添加以下两行。注意,第二行必须以 TAB 开头。

.cc.o:
    $(CC) $(CFLAGS) -c $<  # NOTE This should begin with TAB
于 2012-11-30T05:26:03.833 回答
1

如果您在控制台上查看 Make 的输出,您会看到如下所示:

g++ -Wall -shared -I../src Foo.cpp Bar.cpp -o ../bin/MyPlugin.so

如您所见,要编译的文件的路径不正确。您已经提到了实现此目的的一种方法,即在源文件名前加上 ../src (这种方法有什么问题)。或者您可以定义文件,如下所示:

FILES=${SRC_PATH}/Foo.cpp \
      ${SRC_PATH}/Bar.cpp

使用上面的方法,如果源路径发生变化,您将不需要手动编辑源路径。

于 2012-11-30T05:30:32.667 回答