Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使生成中间C++;使用IDL编译器在暂存目录中的文件?_C++_Gnu Make_Automake_Corba - Fatal编程技术网

C++ 如何使生成中间C++;使用IDL编译器在暂存目录中的文件?

C++ 如何使生成中间C++;使用IDL编译器在暂存目录中的文件?,c++,gnu-make,automake,corba,C++,Gnu Make,Automake,Corba,作为中间步骤,我有一个调用CORBA IDL编译器生成.cc文件的构建过程,我希望在一个临时目录中创建这些文件,以便使用make clean更轻松地进行清理 我有以下有效的汽车制造规则: if MAKE_CORBA IDLFLAGS = -bcxx $(shell mkdir -p ${srcdir}/idlscratch/ %SK.cc: %.idl $(IDLCC) $(IDLFLAGS) @^ EXTRA_CORBA_SOURCES = ${srcdir}/blahSK.cc

作为中间步骤,我有一个调用CORBA IDL编译器生成.cc文件的构建过程,我希望在一个临时目录中创建这些文件,以便使用make clean更轻松地进行清理

我有以下有效的汽车制造规则:

if MAKE_CORBA
IDLFLAGS = -bcxx

$(shell mkdir -p ${srcdir}/idlscratch/

%SK.cc: %.idl
    $(IDLCC) $(IDLFLAGS) @^

EXTRA_CORBA_SOURCES = ${srcdir}/blahSK.cc

endif
if MAKE_CORBA
IDLFLAGS = -bcxx -C${srcdir}/idlscratch/ -I$(IDLINCPATH)

$(shell mkdir -p ${srcdir}/idlscratch/

${srcdir}/idlscratch/%SK.cc: $(IDLPATH)/%.idl
    $(IDLCC) $(IDLFLAGS) $^

AM_CPPFLAGS += -I$(srcdir)/idlscratch/

EXTRA_CORBA_SOURCES = ${srcdir}/idlscratch/blahSK.cc

endif
此规则有效,但它将.cc文件放在${srcdir}而不是${srcdir}/idlscratch/中,因此我将其更改为以下不起作用的规则:

if MAKE_CORBA
IDLFLAGS = -bcxx -C${srcdir}/idlscratch/

$(shell mkdir -p ${srcdir}/idlscratch/

%SK.cc: %.idl
    $(IDLCC) $(IDLFLAGS) @^

EXTRA_CORBA_SOURCES = ${srcdir}/idlscratch/blahSK.cc

endif
此规则应调用IDL编译器,使其在${srcdir}/idlscratch/中吐出.cc/.hh文件,但是,它似乎没有调用编译器,而是得到:

make[2]: *** No rule to make target `idlscratch/blahSK.cc', needed by `blahSK.o'. Stop.
但是,如果手动调用IDL编译器并将.hh/.cc文件放在${srcdir}/idlscratch目录中,我发现编译成功完成

因此,make似乎没有意识到blahSK.cc文件在子目录中时需要调用IDL编译器


当输出是子目录时,创建规则以使make系统正确调用IDL编译器的正确方法是什么?

此处的相关详细信息是“并将.hh/.cc文件放在${srcdir}/idlscratch目录中”。这样做,它也会在make中起作用

问题是像
%SK.cc:%.idl
这样的规则要求make(默认情况下)在同一位置查找目标及其prereq,并且源文件和所需输出文件不再位于同一位置

你可以通过多种方式来解决这个问题。最简单的方法是使用make的
vpath
directive/feature来指示它在搜索先决条件时有额外的源目录可供搜索。将
vpath%.idl${srcdir}
添加到makefile中可能就足够了


或者,您可以手动(也可以半手动)创建各个输入和输出文件之间的关系,然后使用
%SK.cc:
规则(注意:此行中没有
%.idl
prereq)提供构建
%SK.cc
文件的方法(使用先前设置的先决条件列表).

经过一些实验,我能够创建以下规则:

if MAKE_CORBA
IDLFLAGS = -bcxx

$(shell mkdir -p ${srcdir}/idlscratch/

%SK.cc: %.idl
    $(IDLCC) $(IDLFLAGS) @^

EXTRA_CORBA_SOURCES = ${srcdir}/blahSK.cc

endif
if MAKE_CORBA
IDLFLAGS = -bcxx -C${srcdir}/idlscratch/ -I$(IDLINCPATH)

$(shell mkdir -p ${srcdir}/idlscratch/

${srcdir}/idlscratch/%SK.cc: $(IDLPATH)/%.idl
    $(IDLCC) $(IDLFLAGS) $^

AM_CPPFLAGS += -I$(srcdir)/idlscratch/

EXTRA_CORBA_SOURCES = ${srcdir}/idlscratch/blahSK.cc

endif
使用此规则,根据在$(IDLPATH)中是否有匹配的.idl文件,检查是否需要在${srcdir}/idlscratch/中构建blahSK.cc


像这样构建一个scratch dir还有一个额外的好处,那就是您可以添加一个规则来清除idlscratch dir,并在下一个make上强制重新编译.idl->.cc。否则,编译器不会尝试重新生成%SK.cc文件,除非它注意到相应的.idl文件发生了更改。

哪个CORBA idl编译器?它与make调用的发生方式无关,但我使用的是Omni ORB 4.2.0。我问的原因是TAO会使用MPC工具自动为您处理这些。这当然有效。我不知道为什么我没有在我的答案中也列出这个选项。我想我假设您想保持更一般的
%SK.cc
规则不变。