如何在Makefile.am脚本中指定我只想编译object.o文件?

如何在Makefile.am脚本中指定我只想编译object.o文件?,makefile,automake,gnu-make,Makefile,Automake,Gnu Make,我有一个Makefile.am,它将负责构建最终的应用程序二进制文件: project/src/Makefile.am src目录中还有一个名为ctrnn的子目录,其中包含一个额外的Makefile.am: project/src/ctrnn/Makefile.am SOURCES = network.cpp\ neuron.cpp AM_CPPFLAGS= @CXXFLAGS@ bin_PROGRAMS = foo foo_SOURCES = main.c crtnn/net

我有一个
Makefile.am
,它将负责构建最终的应用程序二进制文件:

project/src/Makefile.am
src目录中还有一个名为
ctrnn
的子目录,其中包含一个额外的
Makefile.am

project/src/ctrnn/Makefile.am
SOURCES = network.cpp\
    neuron.cpp

AM_CPPFLAGS=  @CXXFLAGS@
bin_PROGRAMS = foo foo_SOURCES = main.c crtnn/network.cpp crtnn/neuron.cpp 现在,
ctrnn/Makefile.am
应该只生成object
.o
文件,其思想是顶级
Makefile.am
应该使用在子目录
ctrnn
中生成的对象文件来构建二进制文件

这是
ctrnn/Makefile.am

project/src/ctrnn/Makefile.am
SOURCES = network.cpp\
    neuron.cpp

AM_CPPFLAGS=  @CXXFLAGS@
bin_PROGRAMS = foo foo_SOURCES = main.c crtnn/network.cpp crtnn/neuron.cpp 基于这个
Makefile.am
文件,我想以network.o和neuron.o结束。我正在使用Automake等工具生成相应的
Makefile
,但是当我尝试然后执行make文件时,它什么也不做,只是说:

make: Nothing to be done for `all'
我知道这是为什么,我需要指定构建目标。但是如果我不想构建一个二进制文件,它需要的是实际的对象文件
network.o
neuron.o
,那么如何在
ctrnn/Makefile.am
脚本中实现这一点呢

(注意,如果我确实指定了一个bin_程序名,它就正确地结束了对main的未定义引用的抱怨)


我做错了什么?

您可以简单地在project/src/Makefile.am中指定源文件,而不在ctrnn中指定Makefile.am:

maude_SOURCES = ctrnn/network.cpp ctrnn/neuron.cpp maude_SOURCES=ctrnn/network.cpp ctrnn/neuron.cpp 也可以使用libtool便利库。在ctrnn/Makefile.am中,输入:

noinst_LTLIBRARIES = libctrnn.la libctrnn_la_SOURCES = network.cpp neuron.cpp noinst_LTLIBRARIES=libctrnn.la libctrnn_la_SOURCES=network.cpp neuron.cpp 在src/Makefile.am中,输入

LDADD = ctrnn/libmylib.la LDADD=ctrnn/libmylib.la
如果尚未使用libtool,还需要添加LT_INIT来配置.ac。

如果没有使用这些对象的明确目标(程序、库),Automake无法生成对象。一个原因是编译选项是按目标指定的。如果两个目标(例如两个二进制文件)使用相同的对象,但具有不同的编译选项,则同一对象可能需要编译两次

你有三种方法来做你想做的事情,它们都涉及到把你的源文件绑定到某个目标上

  • 不要使用
    src/ctrnn/Makefile.am
    ,只需从
    src/Makefile.am
    中引用子目录源文件即可: bin_PROGRAMS = foo foo_SOURCES = main.c crtnn/network.cpp crtnn/neuron.cpp 在
    src/Makefile.am
    中,将可执行文件链接到库: bin_PROGRAMS = foo foo_SOURCES = main.c foo_LDADD = crtnn/libcrtnn.a SUBDIRS = crtnn 和
    src/Makefile.am
    如下所示: bin_PROGRAMS = foo foo_SOURCES = main.c foo_LDADD = crtnn/libcrtnn.la SUBDIRS = crtnn bin_程序=foo foo_SOURCES=main.c foo_LDADD=crtn/libcrtn.la SUBDIRS=crtn 有什么区别?你可能会问,几乎没有。使用Libtool便利库的一个优点是它们可以嵌套:Libtool库可以包含另一个Libtool库(当您有一个较深的源代码层次结构,并且在每个级别构建库时,这非常方便)。如果需要,还可以使用Libtool便利库构建共享库。Automake的静态库不能


  • 更好的是,您可以通过执行以下操作,使用源代码较少的目标强制make:

    SUBDIRS = sub1 sub2 …
    lib_LTLIBRARIES = libtop.la
    libtop_la_SOURCES =
    # Dummy C++ source to cause C++ linking.
    nodist_EXTRA_libtop_la_SOURCES = dummy.cxx
    libtop_la_LIBADD = \
      sub1/libsub1.la \
      sub2/libsub2.la \
    ...
    
    秘密肉汁是
    nodist\u EXTRA\u xxxx\u la\u SOURCES


    更多详情请点击此处:

    谢谢!我最终使用了libtool方法,效果非常好:-)感谢您的帮助,帮助我在autotools/libtool地狱中奋力拼搏。帮我们大家一个忙:长命百岁!富尔达德?那不是应该是福吗_LIBADD@EgbertS
    \u LIBADD
    用于将对象添加到库中,但
    foo
    不是库。回答非常全面。谢谢