如何在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
不是库。回答非常全面。谢谢