g ++编译存在于另一个目录中的源文件

时间:2012-11-30 05:15:58

标签: c++ gcc g++ makefile

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

我的项目目录结构如下:

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 ++给了我一个错误。看起来通过-I标志指定的路径仅用于搜索#include d文件。

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

我不能使用通配符(*.cpp),因为我并不总是希望拾取所有文件进行编译。另一个替代方法是cd到src目录,如前所述here,并从那里运行g ++,但这只适用于我,如果所有文件都在同一目录中(我需要输出为单个.so文件)。我也尝试设置环境变量PATH,但这似乎没有任何影响。

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

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

3 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:1)

您可以将所有候选源目录放到VPATH中,如下所示:

VPATH=${SRC_PATH}:other_source_dir1:other_source_dir2

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

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

FILES = file1.o file2.o

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

.cc.o:
    $(CC) $(CFLAGS) -c $<  # NOTE This should begin with TAB

答案 2 :(得分:1)

如果您在控制台上查看Make的输出,您将看起来如下所示:

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

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

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

使用上述方法,如果更改,则无需手动编辑源路径。