【问题标题】:How do you compile without linking in Automake?如何在不链接 Automake 的情况下进行编译?
【发布时间】:2010-11-02 06:20:25
【问题描述】:

我是 Automake 的新手,我试图在不链接的情况下进行编译。我的目标是使用 Automake 生成一个简单的 Makefile,如下所示。

CFLAG = -Wall

build: Thread.o

Thread.o: Thread.cc Thread.h
    g++ $(CFLAG) -c Thread.cc

clean:
    rm -f *.o

到目前为止,我的尝试将我带到了以下 Makefile.ac。

noinst_PROGRAMS = thread

thread_SOURCES = Thread.cc

EXTRA_DIST= Thread.h

如何模拟我的原始 Makefile?

【问题讨论】:

    标签: gcc makefile linker compilation automake


    【解决方案1】:

    一种方法是通过提供不链接的链接命令来欺骗 Automake:

    thread_LINK = true
    

    除此之外,如果 Automake 没有这样的功能,我不会感到惊讶。

    【讨论】:

    • 这是解决问题的简单方法。感谢您的建议。
    【解决方案2】:

    对于您的示例,您可以要求 Automake 直接构建您的 .o 文件,例如

    $ make Thread.o
    

    我相信这是一个隐含的规则,所以你不会在输出 Makefile 中看到它。

    通常,Automake 生成的变量包含所有每个可执行文件或库目标所需的对象。在Makefile 中使用它们非常简单,因为它只是通过将_OBJECTS 附加到目标名称来生成它们的名称。您可以像这样在Makefile.am 中创建自己的目标:

    build-thread: $(thread_OBJECTS)
    

    然后您可以像这样构建 Thread.o(以及 thread 所需的任何其他对象):

    $ make build-thread
    

    或者,如果您有多个目标 foobarbaz,您可以像这样在 Makefile.am 中创建仅编译目标:

    build: $(foo_OBJECTS) $(bar_OBJECTS) $(baz_OBJECTS)
    

    这里唯一的麻烦是您需要根据Makefile.am 中的目标自己维护此列表。你可以像这样在命令行调用它:

    $ make build
    

    【讨论】:

      【解决方案3】:

      Automake 不是为生成对象而设计的。它将构建程序或库。 如果不知道为什么要编译单个目标文件而不是其他文件,很难回答您的问题。也许对您的“真正”问题有更清晰的答案。

      你可以写的Makefile.am

      noinst_LIBRARIES = libThread.a
      libThread_a_SOURCES = Thread.cc Thread.h   # No need to put headers in EXTRA_DIST
      

      生成的Makefile 将构建一个库libThread.a,只包含libThread.o,因为*.a 库只是目标文件的集合,不涉及链接。 上面的Makefile.am 也会导致发出的Makefile 包含编译libThread.o 的规则,因此您可以根据需要添加build: 规则。

      如果您真的希望 Automake 发出此编译规则,但不构建库,您可以使用

      EXTRA_LIBRARIES = libThread.a  # EXTRA here means "output build rules but don't
                                     # build unless something depends on it".
      libThread_a_SOURCES = Thread.cc Thread.h
      build: Thread.$(OBJEXT)
      

      现在您明确要求仅当您键入 make build 时才构建文件 Thread.$(OBJEXT),就像您原来的 Makefile 一样。

      (Automake 使用.$(OBJEXT) 而不是.o 来支持DOS 变体中的.obj 等扩展。)

      【讨论】:

        【解决方案4】:

        首先,automake 是一个自动制作 Makefile 的工具; make 本身就是一个完全不同的野兽(我很确定您正在寻找的是一个 make 解决方案)。

        这是完成您想要的最简单的基于 GNU 的 Makefile:

        all: Thread.o
        

        这会(默认情况下)填充如下内容(请将 4 空格空格更改为硬制表符):

        all: Thread.o
        
        Thread.o: Thread.cc
             $(COMPILE.cpp) $(OUTPUT_OPTION) $<
        

        COMPILE.cpp 和 OUTPUT_OPTION 宏当然默认扩展为 GNU 生成指定值并且不可移植;尽管根据 pmake(1) 的手册页,$

        GNU make 有一个可以使用的隐式与显式规则、模式、后缀等的概念,但这并不适用于所有版本的 make,因此这就是为什么所有 Makefile 都以目标明确说明的原因和变量,因为 POSIX 并没有描述人们应该如何编写 Makefile 的许多所需场景。

        运行 gmake -p 了解更多详细信息,并查看 gmake 的 texinfo 手册,主题为隐式、显式规则、模式、后缀等。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-01-21
          • 1970-01-01
          • 1970-01-01
          • 2011-03-21
          • 1970-01-01
          • 2012-07-18
          • 1970-01-01
          相关资源
          最近更新 更多