在为QMAKE_EXTRA_COMPILER选项执行make时,是否存在任意分配订单的方法?似乎申报顺序似乎影响到了它,但它似乎行不通.
我有一堆fortran代码需要编译,然后存档到一个静态库中(使用ar
命令),以供我正在构建的DLL使用。Iv在我的.pro文件中对此进行了精简,使一切都一蹴而就,但遇到了一些小麻烦。
以下是重要的事情:
win32 {
gfortran.commands = gfortran $${FORTRAN_FLAGS} ${QMAKE_FILE_NAME} -c -o ${QMAKE_FILE_OUT}
gfortran.input = FORTRAN_SOURCE
gfortran.output = ../../src/SupMods/FireNetworkDLL/${QMAKE_FILE_BASE}.o
gfortran.CONFIG = target_predeps
QMAKE_EXTRA_COMPILERS += gfortran
}
win32 {
archive.commands = ar -qsc ${QMAKE_FILE_OUT} $${FORTRAN_OBJ}
archive.input = FORTRAN_OBJ
archive.output = ../../src/SupMods/FireNetworkDLL/libORAN.a
archive.CONFIG = combine target_predeps
QMAKE_EXTRA_COMPILERS += archive
}
这只适用于time...no的一些想法--为什么。另外,FORTRAN_SOURCE
只是所有fortran文件的列表(例如: fire.f95),$${FORTRAN_OBJ}
是所有fortran .o文件的列表。
那么,有什么方法可以让我总是先从gfortran生成对象文件,然后按照ar
命令进行操作吗?(我猜这与dependency_type
或depends
有关.)
另外,如果有人有一个更好的方法,我都是耳朵,第一次捣乱的qmake真的。
**这与变量FORTRAN_OBJ引用实际上在构建开始之前并不存在的.o文件有关吗?
发布于 2013-09-18 07:36:10
好吧..。最后只是将所有的对象文件添加到最终的DLL中,而不是使用静态库!早就该这么做了.
发布于 2013-09-30 22:18:12
qmake额外编译器的处理顺序取决于编译器的输入/输出变量的查询。例如,如果第一个编译器从变量A获取输入文件并将输出文件名写入变量B,而第二个编译器从变量B获取其文件,那么第一个编译器将在第二个编译器之前由qmake处理。
从您的来源中还不清楚如何填充FORTRAN_OBJ变量。从你报告的症状来看,我怀疑你用手填了这个变量。我建议不要。让QMAKE_EXTRA_COMPILER自动完成这项工作。
以下代码应该有效(未经测试):
gfortran.commands = gfortran $${FORTRAN_FLAGS} ${QMAKE_FILE_NAME} -c -o ${QMAKE_FILE_OUT}
gfortran.input = FORTRAN_SOURCE
gfortran.output = ../../src/SupMods/FireNetworkDLL/${QMAKE_FILE_BASE}.o
gfortran.CONFIG = target_predeps
# the only change required I guess
gfortran.variable_out = FORTRAN_OBJ
QMAKE_EXTRA_COMPILERS += gfortran
archive.commands = ar -qsc ${QMAKE_FILE_OUT} $${FORTRAN_OBJ}
archive.input = FORTRAN_OBJ
# I suggest to use $$OUT_PWD here
archive.output = ../../src/SupMods/FireNetworkDLL/libORAN.a
archive.CONFIG = combine target_predeps
QMAKE_EXTRA_COMPILERS += archive
不要混淆处理顺序(通过qmake向Makefile生成规则)和执行顺序(运行make时执行规则)。通常,必须通过指定目标之间的依赖关系来仔细管理最后一个目标。但是在这种情况下,所有所需的依赖项都将自动生成,这是因为在默认情况下,qmake会为每一对对应的输入和输出文件生成一个依赖项。因此,在本例中,libORAN.a将依赖于FORTRAN_OBJ变量中的所有文件,这反过来将依赖于相应的源fortran文件,并保证事件的正确顺序。
如果你能读俄语,有更多关于QMAKE_EXTRA_COMPILERS 在我的博客里的信息。
https://stackoverflow.com/questions/18854750
复制