【问题标题】:g++ compile source files existing in another directoryg ++编译存在于另一个目录中的源文件
【发布时间】:2012-11-30 05:15:57
【问题描述】:

我正在尝试使用 makefile 为我正在开发的 C++ 插件设置构建过程。我很想知道是否有任何方法可以让 g++ 编译在另一个目录中找到的 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标志指定的路径只用于搜索#included文件。

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

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

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

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

【问题讨论】:

  • 为什么输出是单个 .so 文件会阻碍您 cd 进入src 目录?
  • 就像我提到的,只有在所有源文件都在同一个目录中时才有效。我希望将所有源文件一起编译成一个 .so 文件。

标签: c++ gcc g++ makefile


【解决方案1】:

实际源文件可以有第二个变量,像这样:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    使用上述方法,如果源路径发生变化,您无需手动编辑源路径。

    【讨论】:

    • 嗯,我想知道g++命令是否可以自动拥有src/Foo.cpp src/Bar.cpp。 g++ -I 标志允许您使用#include "Foo.h" 而不是#include "../foo/Foo.h"。我正在尝试查看源文件是否有类似的方法。正如我所提到的,如果所有源文件都在同一个目录中,则该方法效果很好,但是我的项目在每个目录中有多个子目录和多个文件。它变得很麻烦。如果可能的话,我宁愿只指定文件名,并配置makeg++ 以找出它在哪里。
    【解决方案3】:

    您可以像这样将所有候选源目录放入 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
    

    【讨论】:

    • 感谢您的回复。我已经使用了VPATH 变量,但这似乎不起作用。 g++ 命令(由 make 响应)看起来像:g++ -Wall -shared -I../src Foo.cpp Bar.cpp -o../bin/MyPlugin.so 它没有 src/Foo.cpp src/Bar.cpp
    • 我在回答中添加了两个额外的步骤,请尝试。
    猜你喜欢
    • 2012-04-08
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    • 2018-01-28
    • 2015-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多