Autotools 库和目标文件输出控制

2024-03-10

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

这是我的configure.ac和src/Makefile.am- 我有两个引用的共享库的类似 Makefile.am 文件。他们编译,并将它们复制到bin/目录按其应有的方式工作。我只是想自动化这个过程。

配置文件

AC_PREREQ([2.63])
AC_INIT([gtkworkbook], [0.12], [[email protected] /cdn-cgi/l/email-protection])
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 的根目录中。

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


GNU 构建系统不使用obj/目录,因此自动工具不支持该目录。

不过我可以想到两种方法来解决这个问题。

作为安装程序,您可以通过键入以下内容从其源目录构建任何包

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

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

作为打包者,强制你的包构建所有内容的唯一方法obj/就是把你的Makefile.am in obj/,并在那里声明所有构建规则。这意味着obj/Makefile.am看起来像:

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 软件包一样工作的构建系统。

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

特别是用例部分。 如果您不关心这些用例,我认为您最好的做法是不要使用 Automake,并构建自己的 Makefile。否则你会一直试图强迫 Automake 做一些它不适合的事情,你很快就会讨厌它。

编辑2013-08-26:请注意,Automake 项目使用名为using obj/不便于携带 http://www.gnu.org/software/autoconf/manual/autoconf-2.67/html_node/obj_002f-and-Make.html到 BSD 使。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Autotools 库和目标文件输出控制 的相关文章

随机推荐

  • 用于分析 .Net 应用程序内存转储的工具

    有人可以推荐一个好的吗free除了 Adplus windbg sos 之外 还有用于分析 Net 内存转储的工具吗 你可以尝试一下调试诊断1 1 http blogs msdn com tess archive 2008 05 21 de
  • 是什么导致 Python 错误“bad escape \C”?

    我刚刚编写了一个函数 它将查看文本文件并计算文本文件中 True 和 False 的所有实例 这是我的文件 ATOM 43 CA LYS A 5 14 038 15 691 37 608 1 00 15 15 C True ATOM 52
  • Raft算法:term什么时候会增加?

    Raft将时间划分为任意长度的术语 如图5所示 术语用连续的整数编号 每个任期以一次选举开始 其中一名或多名候选人试图成为领导者 如第 5 2 节所述 如果候选人赢得选举 那么他将在剩余任期内担任领导者 在某些情况下 选举会导致投票分散 在
  • 为什么从搅拌机导出到 Unity 时我的 (FBX) 网格体有孔?

    我现在正在学习雕刻我的角色 当我将 FBX 文件从 Blender 导出到 Unity 时 网格物体的脸上有一个巨大的洞 我该如何预防 解决这个问题 它在 mixamo 中工作得很好 在此输入图像描述 https i stack imgur
  • C++11 中字符串文字的 Unicode 编码

    继一个相关问题 https stackoverflow com questions 6794590 how does file encoding affect c11 string literals 我想问一下C 11中新的字符和字符串文字
  • NUnit 插件与 Resharper 5

    最新的 Resharper v5 版本基于本机 NUnit 代码并允许 NUnit 插件 我有一个 NUnit 插件 可以在 NUnit GUI 中正常工作 但无法使其与 Resharper 一起工作 根据 R 指示 我已将插件库放入 Re
  • 如何使用 PHP/MySQLi 将 NULL 放入 MySQL 整数列?

    我通过 URL 将值传递到 PHP 页面 并在 MySQLi 查询中使用它们 问题在于 对于整数列 空字符串会转换为零 而实际上它需要为 NULL 如何使用 PHP MySQLi 从 URL 中传递的参数获取 NULL 到整数列中 更新 下
  • 不推荐在 build.gradle 中“启用”Android 数据绑定

    in build gradle file dataBinding enabled true enabled已弃用 找不到任何有关它的文档 任何人有任何想法如何解决它 尝试将其替换为 buildFeatures dataBinding tru
  • 获取多个 Pandas DataFrame 的平均值

    我正在生成许多具有相同形状的数据框 并且我想将它们相互比较 我希望能够获得数据帧的平均值和中位数 Source 0 Source 1 Source 2 Source 3 cluster 0 0 001182 0 184535 0 81423
  • 无法让 SendInput() 工作

    我有点绝望了我已经尝试了几个小时了 但就是无法得到SendInput 上班 说实话 我什至无法得到它的认可 它总是说 Error 1 The type or namespace name INPUT could not be found a
  • 如何将页面分为三个垂直部分?

    我想将我的网页转换为四个部分 一横三竖 水平截面还可以 但是垂直截面有两个问题 它们没有填满整个屏幕高度 第三部分与第二部分重叠近10或20个像素 这是我的CSS body width available height available
  • Maven 3 密码加密是如何工作的?

    我正在尝试了解 Maven 3 的 密码加密功能 我发现这个功能的文档记录很少并且令人困惑 例如 功能文档 https maven apache org guides mini guide encryption html and 该功能作者
  • Android getX/getY 交错相对/绝对坐标

    有很多关于 MotionEvent getX getY 如何 不可靠 或其他术语 的讨论 以及我们应该使用这些调用的原始版本来获取坐标 在我的 Nexus 7 上 我发现 getX getY 可靠地返回交错的绝对和相对坐标 换句话说 假设给
  • 获取 AccessibilityNodeInfo 视图以创建叠加层

    我正在写一个AccessibilityService我想在无障碍服务可以检索的当前活动的视图上创建视图覆盖 我可以毫无问题地检索所有内容AccessibilityNodeInfo当前活动中的对象 但我不知道如何从这些对象获取视图来创建叠加层
  • Filesystemwatcher 导致“目录 C:\ 中一次发生太多更改错误”

    像其他一些人一样 当文件系统观察程序执行其工作时 我收到错误 目录 C 中一次错误太多更改 现在如果是c 显然有很多变化 但在这种特殊情况下 我设置了以下参数 Path C Filter test1 txt NotifyFilter Not
  • 检查内容是否溢出

    我需要知道我的内容何时溢出我的 div 如果是这样 我将放置一个链接 以便在新窗口中打开包含所有内容的页面 Cheers DalexL 使用 jQuery 和文本溢出时的选取框文本 https stackoverflow com quest
  • 如何控制RDD分区的首选位置?

    有没有办法手动设置RDD分区的首选位置 我想确保在特定机器上计算特定分区 我使用数组和 Parallelize 方法从中创建 RDD 另外我没有使用 HDFS 文件位于本地磁盘上 这就是为什么我要修改执行节点 有没有办法手动设置RDD分区的
  • 为 Monotouch 对话框元素设置自定义字体

    有没有办法在实例化 Monotouch Dialog 类时设置字体 Section This is the header 这将使用带阴影的默认蓝色文本进行渲染 但我找不到设置该字体的位置 有没有办法覆盖它使用的字体和颜色 我为那些希望替换整
  • 如何复制范围并仅将包含值的行粘贴到另一个工作表中?

    首先我要说的是 我意识到简单的解决方案是过滤列 取消选中空白 将值复制并粘贴到新列中 问题在于 对于不 精通技术 的教师来说 没有什么是简单的 话虽如此 我正在将同一个谷歌电子表格中的多个工作表中的数据提取到 主 工作表中 我有一个名为 可
  • Autotools 库和目标文件输出控制

    我的目标是将所有目标文件构建在 objs 目录中而不是 Makefile 的根目录中 并将二进制文件 和库 复制到项目的bin 目录 但我一直无法找到任何资源来解释如何做到这一点 我该怎么做呢 这是我的configure ac和src Ma