【发布时间】:2017-09-18 10:13:45
【问题描述】:
背景
我们为 Matlab 和 Octave 构建 .mex 文件。源代码对 Matlab 和 Octave 都是通用的,但在这里和那里稍作修改(通过代码中的宏条件处理)。供参考,源码结构为:
mex/
|
------------------------------
| |
sources/ build/
| |
----------- -------------------------------
| | | | | |
mex1/ ... mexN/ octave/ mex1.am ... mexN.am matlab/
| | |
----------- ------------- -------------
| | | | | |
file1.cc ... fileM.cc configure.ac Makefile.am configure.ac Makefile.am
.mex 源文件位于mex/sources/mex*/,我们编译多个.mex 文件。
Matlab 构建系统位于 mex/build/matlab/,我们在其中运行“./configure”来定位编译 Matlab .mex 文件所需链接的头文件/库。 /mex/build/octave/ 中存在类似的 configure.ac 和 Makefile.am 文件,已修改以查找 Octave 头文件和库。
Matlab 和 Octave 共有的 automake 构建指令(源文件的路径,要构建的 .mex 文件)存在于名为 /mex/build/mex*.am 的文件中,通常如下所示:
mexI_PROGRAMS += mexI
nodist_mexI_SOURCES = \
../../sources/mexI/mexI.c \
../../sources/mexI/mexI_file1.c \
../../sources/mexI/mexI_fileN.c
递归 make 非常适合我们的设置(我们曾经有名为 /mex/build/matlab/mex*/ 和 /mex/build/octave/mex*/ 的目录,其中包含 Makefile.am 文件;目标文件将在那里编译,输出文件将位于那里)。现在,鉴于 GNU subdir-objects 发生的变化,我们正在转向非递归构建。从 Matlab 构建开始,我能够将其修改为以非递归方式工作而没有任何问题。
问题
在转向非递归构建时,目标文件现在与其源文件在同一目录中生成,即/mex/sources/mex*/。由于我已经编译了 Matlab .mex 文件,*.o 文件存在于这些源目录中。因此,当我编译 Octave 文件时,make 直接跳到链接步骤,因为它已经在目录中看到了最近的 *.o 文件。当然,问题是这些*.o 文件是使用 Matlab 头文件编译的,因此在 Octave 构建中不起作用。
最简单的解决方案是简单地定义一个放置目标文件的目录。目前,典型的构建编译命令如下所示(删除标志):
gcc ... -o ../../sources/mex1/mex1.o ../../sources/mex1/mex1.c
我只想更改传递给-o 标志的文件的位置,但不知道如何在 automake 中执行此操作。 当然,除非有更优雅的方法解决方案。
【问题讨论】:
-
所以,在您的问题描述中,您已经给出了答案。只需定义将放置目标文件的目录。并为 matlab 和 octave 对象以不同的方式命名该目录。它需要一些
GNU make函数和/或一些bash脚本,我猜... -
@igagis 感谢您的回复。如果我编写脚本将
.o.文件移动到不同的目录,make不会在后续运行中重新编译所有内容,而不仅仅是那些已更改的文件?另外,我必须编写特定的链接规则,并且不能使用autoconf创建的规则。我错了吗? -
由于您提到的原因,移动对象文件不是一个好主意。看看这里的my answer,我认为它可以满足您的需求。
标签: makefile build autotools autoconf automake