6

I have a number of C++ files distributed in several folders.

a_library/
    file1.cpp
    file2.cpp
    category1/
        file3.cpp
        file4.cpp

They are guaruanteed to be uniquely named. I want to compile all those C++ files to seperate Object-files in the obj/ directory.

I have a list of all source-files with relative path, and their corresponding destination-names.

a_library/file1.cpp
a_library/file2.cpp
a_library/category1/file3.cpp
a_library/category1/file4.cpp

obj/file1.obj
obj/file2.obj
obj/file3.obj
obj/file4.obj

How can I make a rule that will convert a C++ file from the first list to a object-file from the second one?

These attempts do not work:

obj/%.obj: %:cpp
    # ...

%.obj: %.cpp
    # ...

.cpp.obj:
    # ...

I would like to not write rules like this:

obj/%.obj: a_library/%.cpp
    # ...

obj/%.obj: a_library/category1/%.cpp
    # ...
4

5 回答 5

5

尝试设置VPATH

VPATH = a_library:a_library/category1
obj/%.o: %.cpp
    $(CXX) -c $(CPPFLAGS) $(CFLAGS) $(CXXFLAGS) -o $@ $<

并添加完整的文件列表(我建议您明确列出文件,不要使用$(wildcard ...)函数)和应用程序的链接:

files := main.cpp $(wildcard a_library/*.cpp) a_library/category1/file.cpp

obj/application: $(patsubst %.cpp,obj/%.o,$(notdir $(files)))
    $(CXX) $(CFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@ $+

有一种讨厌的$(wildcard)倾向,即在目录中获取任何内容,例如一次性测试文件或临时文件(如果它们碰巧有一个合适的名称:)~file.cpp

于 2012-07-26T10:50:07.617 回答
1

我能想到的一种解决方案:只需使用简单的规则就地构建它们,然后进行“收集阶段”,将“.o”文件移动到单个文件夹。

制作一个取决于您的 $(OBJS) 的“collect_objs”目标,然后您的“主要”目标必须取决于“collect_objs”。

遍历可以使用shell完成

dirs := $(shell find ./ -type d)
collect_objs: $(dirs)
      for d in $+; do \
          mv *.o YourDestDir/*.o
      done

当然,这意味着使用 UnxUtils 包(带有“find”和“mv”)或 Cygwin,因为您在 Windows 上。

另一种选择是使用某些工具显式地为每个 .c/.cpp 文件生成目标。抓取 python,遍历源目录并为每个 .c/.cpp 文件写入

obj/file_name.o:
       gcc -c path/fo/file_name.c -o obj/file_name.o
于 2012-07-26T10:09:21.990 回答
0

使用cmake为您进行构建配置。

前段时间我在github上搭建了一个简单的示例项目。

于 2012-07-26T10:14:07.300 回答
0

标准方法是Makefile在每个文件夹中都有一个并递归调用include

这是我在 10^100 上的前两次点击:

http://owen.sj.ca.us/~rk/howto/slides/make/slides/makerecurs.html

http://www.gnu.org/savannah-checkouts/gnu/make/manual/html_node/Recursion.html

于 2012-07-26T12:07:18.350 回答
0

与这个问题没有严格相关,因为它与 Make 无关,尽管我想展示我现在如何编译我的项目,3 年后。Craftr是一个基于 Python 的元构建系统,它鼓励间接的树外构建(例如build工作树中的 a)。构建目标文件和创建静态库就像

# craftr_module(my_project)
from craftr import *
from craftr.ext.platform import cxx, ar
objects = cxx.compile(
  sources = path.platform('**/*.cpp'),
)
lib = ar.staticlib(
  output = 'myproj',
  inputs = [objects],
)

运行craftr -eb将产生以下构建产品结构

Craftfile
file1.c
file2.c
category1/
  file3.c
  file4.c
build/
  my_project/
    obj/
      file1.o
      file2.o
      category1/
        file3.o
        file4.o
    libmyproj.a
于 2015-12-25T22:02:23.103 回答