Autotools库和目标文件输出控件 [英] Autotools library and object file output control

查看:87
本文介绍了Autotools库和目标文件输出控件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的目标是将所有对象文件构建在.objs目录中,而不是Makefile的根目录中,并将二进制文件(和库)复制到项目的 bin/目录中.但是我一直找不到任何资源来解释如何做到这一点.我将如何去做?

My goal is to have all object files built in a .objs directory instead of the root of the Makefile, and to have the binaries (and libraries) copied into the project's bin/ directory. But I have been unable to find any resources to explain how to do this. How would I go about doing this?

这是我的configure.ac和 src/Makefile.am -我有两个相似的Makefile.am文件,用于两个共享库.它们进行编译,然后将它们复制到 bin/目录,然后按预期进行工作.我只是想使这个过程自动化.

Here is my configure.ac and src/Makefile.am - I have similar Makefile.am files for two shared libraries that are referenced. They compile, and after copying them to the bin/ directory work as they should. I'm just looking to automate this process.

configure.ac

AC_PREREQ([2.63])
AC_INIT([gtkworkbook], [0.12], [j_bellone@users.sourceforge.net])
AC_CONFIG_SRCDIR([gtkworkbook/cell.c])
AM_INIT_AUTOMAKE([gtkworkbook], [0.12])

# Checks for programs.
AC_PROG_CXX
AC_PROG_CC
AC_PROG_INSTALL
AC_PROG_MAKE_SET
AC_PROG_RANLIB
AC_PROG_LIBTOOL
AC_PROG_CC_C_O

AC_CHECK_LIB([pthread], [pthread_mutex_init], [], [
            echo "pthread library is missing. pthread is required for this program"
            exit -1])

# Checks for header files.
AC_CHECK_HEADERS([arpa/inet.h netdb.h netinet/in.h stdlib.h string.h sys/socket.h unistd.h])

# Checks for typedefs, structures, and compiler characteristics.
AC_HEADER_STDBOOL
AC_C_INLINE
AC_TYPE_SIZE_T

# Checks for library functions.
AC_CHECK_FUNCS([gethostbyname memset socket])

AC_OUTPUT([Makefile
       csv/Makefile
       gtkworkbook/Makefile
       src/Makefile])

src/Makefile.am

AUTOMAKE_OPTIONS= foreign

C_FLAGS= -I/usr/local/include -I/usr/include -I/usr/local/include/gtkextra-2.0 -I$(top_srcdir)/include `pkg-config gtk+-2.0 glib-2.0 --cflags`
L_FLAGS= -L/usr/local/lib -L/usr/lib -L$(top_srcdir)/lib `pkg-config gtk+-2.0 glib-2.0 --libs` -lgtkextra-x11-2.0

bin_PROGRAMS= gtkworkbook
gtkworkbook_SOURCES= application.c config.c main.c parse.c plugin.c
gtkworkbook_CFLAGS= -Wall -lgthread-2.0 -std=c99 $(C_FLAGS)  
gtkworkbook_LFLAGS= -ldl $(L_FLAGS)
gtkworkbook_LDFLAGS= $(L_FLAGS)
gtkworkbook_LDADD= ../gtkworkbook/libgtkworkbook.la ../csv/libcsv.la

lib_LTLIBRARIES= realtime.la
realtime_la_SOURCES= realtime/CsvParser.cpp realtime/Network.cpp realtime/Packet.cpp realtime/plugin_main.cpp \
    realtime/thread_main.cpp realtime/concurrent/Mutex.cpp realtime/concurrent/Semaphore.cpp \
    realtime/concurrent/Thread.cpp realtime/concurrent/ThreadGroup.cpp realtime/concurrent/ThreadPool.cpp \
    realtime/proactor/Dispatcher.cpp realtime/proactor/Event.cpp realtime/proactor/Proactor.cpp \
    realtime/proactor/InputDispatcher.cpp realtime/proactor/Worker.cpp realtime/network/Tcp.cpp
realtime_la_CPPFLAGS= -Wall -Wno-write-strings $(C_FLAGS)
realtime_la_LFLAGS= -lgtkworkbook -lcsv $(L_FLAGS)
realtime_la_LDFLAGS= -module -export-dynamic 
realtime_la_LIBADD= ../gtkworkbook/libgtkworkbook.la ../csv/libcsv.la

所以,我的问题是如何为每个Makefile的编译结果指定输出目录(我希望将它们复制到 bin/中,并将目标文件保存在中.obj ,而不是在Makefile的根目录中.

So, my question is how to specify the output directories for the compile results of each Makefile (I wish them to be copied to bin/, and for the object files to be in .obj of each project instead of in the root of the Makefile.

到目前为止,感谢您的帮助..该网站是一个很好的资源,从已经提供的链接中我学到了很多东西.

Thanks for the help thus far.. this website has been a great resource, and I have learned a lot from the links provided already.

推荐答案

GNU Build System不使用obj/目录,因此自动工具并不旨在支持该目录.

The GNU Build System does not use obj/ directories, so the autotools are not designed to support that.

但是我可以想到两种解决方法.

However I can think of two ways to work around this.

作为安装程序,您可以通过键入

As an installer, you can build any package out of its source directory by typing

mkdir builddir
cd builddir
../path-to-sourcedir/configure
make

然后将在builddir/目录中创建任何输出文件.通过这种编译方案,可以将源代码编译出只读目录(在FSF分发带有未压缩源代码的CD的年代更有意义),或者可以使用不同设置(或什至对于不同的架构).

Then any output file will be created in the builddir/ directory. This compilation scheme makes it possible to compile source code out stored in a readonly directory (this made more sense back in the years where the FSF was distributing CDs with uncompressed source code), or to compile the same source with differents settings (or even for different architectures).

作为打包程序,可以强制您的程序包在obj/中构建所有内容的唯一方法是将Makefile.am放入obj/中,并在其中声明所有构建规则.这意味着obj/Makefile.am看起来像这样:

As a packager, the only way you could force your package to build everything in obj/ is to put your Makefile.am in obj/, and declare all your build rules there. This would mean a obj/Makefile.am looking like:

bin_PROGRAMS = foo bar
foo_SOURCES = ../src/foo/main.c ../src/foo/help.c ../src/foo/list.c
bar_SOURCES = ../src/bar/bar.c 

等我记得10年前,POSE(Palm OS仿真器)使用的是上述设置.我不建议这样做,因为它实际上并不能维护.最好坚持使用这些工具的理念,并使用与其他GNU软件包一样工作的构建系统.

etc. I remember that 10 years ago, POSE, the Palm OS Emulator, was using a setup like the above. I don't recommend it as it's not really maintainable. It's really better to stick with the philosophy of the tools, and use a build systems that work like the other GNU packages.

有关GNU Build System的介绍,我建议阅读Automake手册的介绍: http://www.gnu.org/software/automake /manual/automake.html#GNU-Build-System

For an introduction to the GNU Build System, I recommend reading the introduction of the Automake manual: http://www.gnu.org/software/automake/manual/automake.html#GNU-Build-System

特别是用例"部分. 如果您不关心这些用例,那么我认为最好的方法是不要使用Automake,而要构建自己的Makefile.否则,您将继续尝试迫使Automake做一些它不适合做的事情,并且您会很快讨厌它.

Especially the Use-Cases section. If you don't care about these use cases, I think your best course is NOT to use Automake, and build your own Makefiles. Otherwise you will keep trying to force Automake doing something it is not designed for, and you'll quickly hate it.

编辑2013-08-26 :请注意,一个Automake项目使用名为

EDIT 2013-08-26: Note that an Automake project using a subdirectory named using obj/ is not portable to BSD make.

这篇关于Autotools库和目标文件输出控件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆