Makefile 铿锵++-c将文件输出到错误的目录

Makefile 铿锵++-c将文件输出到错误的目录,makefile,llvm,clang,gnu,llvm-clang,Makefile,Llvm,Clang,Gnu,Llvm Clang,我有一个包含以下步骤的makefile目标: ... cd $(GRAPHICS_BUILD_DIR) clang++ -c -I$(SFML_HEADERS) $(GRAPHICS_DIR)/*.cpp cd $(BASE_DIR) ... 出于某种原因,Clang将生成文件输出到BASE\u DIR,而不是GRAPHICS\u build\u DIR。一切都编译得很好,当我一次手动执行一行时,它工作得很好,*.o文件被输出到正确的目录中 为什么make不将这些文件放在正确的目录中,我如何强

我有一个包含以下步骤的makefile目标:

...
cd $(GRAPHICS_BUILD_DIR)
clang++ -c -I$(SFML_HEADERS) $(GRAPHICS_DIR)/*.cpp
cd $(BASE_DIR)
...
出于某种原因,Clang将生成文件输出到
BASE\u DIR
,而不是
GRAPHICS\u build\u DIR
。一切都编译得很好,当我一次手动执行一行时,它工作得很好,
*.o
文件被输出到正确的目录中

为什么make不将这些文件放在正确的目录中,我如何强制它


我在ubuntu linux内核3.2.0-26上使用clang3.1和当前版本的GNUMake。

问题在于,在Make规则中,每个命令都在自己的子shell中执行;从一行到下一行什么都记不住。因此,您的第一个命令从
$(BASE\u DIR)
开始,移动到
$(GRAPHICS\u BUILD\u DIR)
,然后消失。第二个命令从
$(BASE\u DIR)
开始,并在那里运行

试试这个:

...
cd $(GRAPHICS_BUILD_DIR) ; clang++ -c -I$(SFML_HEADERS) $(GRAPHICS_DIR)/*.cpp
...

问题在于,在Make规则中,每个命令都在自己的子shell中执行;从一行到下一行什么都记不住。因此,您的第一个命令从
$(BASE\u DIR)
开始,移动到
$(GRAPHICS\u BUILD\u DIR)
,然后消失。第二个命令从
$(BASE\u DIR)
开始,并在那里运行

试试这个:

...
cd $(GRAPHICS_BUILD_DIR) ; clang++ -c -I$(SFML_HEADERS) $(GRAPHICS_DIR)/*.cpp
...

要指定要生成的输出文件,可以将
-o…
标志传递给clang。例如,
clang++-c-I$(SFML\u HEADERS)$(GRAPHICS\u DIR)/$(FILE).cpp-o$(GRAPHICS\u BUILD\u DIR)/$(FILE.o
虽然在我看来,
cd
绑定到脚本中的输出目录会导致默认情况下文件位于该输出目录中。@bames53:我无法传递-o标志,因为我正在编译多个文件。是的,这就是为什么我没有把它作为一个答案。不过,你可能不应该这样建造。通常makefiles有库和可执行目标,它们明确列出它们所依赖的对象文件,然后有一个构建对象文件的通用规则。除此之外,它还允许基于依赖关系图进行快速部分重建,并允许您使用
-o
标志显式指定输出文件。我想我需要了解有关make的更多信息。呻吟。我试着用懒惰的方式来做这件事。非常感谢您的回答。请查看最后显示的makefile。这应该给你一个基本的想法。(尽管makefile中的所有目标都应该将makefile本身作为依赖项。)要指定要生成的输出文件,可以将
-o…
标志传递给clang。例如,
clang++-c-I$(SFML\u HEADERS)$(GRAPHICS\u DIR)/$(FILE).cpp-o$(GRAPHICS\u BUILD\u DIR)/$(FILE.o
虽然在我看来,
cd
绑定到脚本中的输出目录会导致默认情况下文件位于该输出目录中。@bames53:我无法传递-o标志,因为我正在编译多个文件。是的,这就是为什么我没有把它作为一个答案。不过,你可能不应该这样建造。通常makefiles有库和可执行目标,它们明确列出它们所依赖的对象文件,然后有一个构建对象文件的通用规则。除此之外,它还允许基于依赖关系图进行快速部分重建,并允许您使用
-o
标志显式指定输出文件。我想我需要了解有关make的更多信息。呻吟。我试着用懒惰的方式来做这件事。非常感谢您的回答。请查看最后显示的makefile。这应该给你一个基本的想法。(尽管makefile中的所有目标也应该将makefile本身作为依赖项。)