1

是否有某种方法可以在为 QMAKE_EXTRA_COMPILER 选项执行 make 时任意分配订单?似乎声明顺序似乎会影响它,但它似乎不起作用......

我有一堆 fortran 代码需要编译然后归档到一个静态库中(使用ar命令),以供我正在构建的 DLL 使用。我一直在我的 .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
}

这仅在某些时候有效……不知道为什么。也 FORTRAN_SOURCE只是所有 fortran 文件的列表(例如:fire.f95),并且$${FORTRAN_OBJ}是所有 fortran .o 文件的列表。

那么有什么方法可以让我总是先从 gfortran 生成目标文件,然后通过ar命令执行它?(我猜它与dependency_typedepends...有关)

此外,如果有人有更好的方法,我会全神贯注,第一次真正搞砸 qmake。

**这可能与变量 FORTRAN_OBJ 引用 .o 文件有关,而这些文件在构建开始之前实际上并不存在?

4

2 回答 2

1

qmake extra 编译器的处理顺序由编译器的输入/输出变量的变化决定。例如,如果第一个编译器从变量 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的信息。

于 2013-10-01T06:18:12.517 回答
0

好吧...最终只是将所有目标文件添加到最终的 DLL 中,而不是使用静态库!早该这么做了……

于 2013-09-18T15:36:10.503 回答