【问题标题】:Qmake - doesn't copy file in linuxQmake - 不在linux中复制文件
【发布时间】:2015-05-28 14:06:05
【问题描述】:

那个代码

defineTest(deployFiles) {
    win32 {
        to = $$shell_path($$3)
        for(entry,1){
            from = $$shell_path($$2/$$entry)
            QMAKE_POST_LINK += $$quote(cmd /c copy /y $$from $$to $$escape_expand(\n\t))
            PRE_TARGETDEPS += $$from
        }
        export(QMAKE_POST_LINK)
        export(PRE_TARGETDEPS)
    } else {
        to = $$shell_path($$3)
        for(entry,1){
            from = $$shell_path($$2/$$entry)
            QMAKE_POST_LINK += $$quote(cp $$from $$to $$escape_expand(\n\t))
            PRE_TARGETDEPS += $$from
        }
        export(QMAKE_POST_LINK)
        export(PRE_TARGETDEPS)
    }
}

仅适用于 Windows 操作系统。其中$$from - 文件; $$to - 目录。

不幸的是,我试过了:

QMAKE_POST_LINK += $$quote(xterm -e cp $$from $$to $$escape_expand(\n\t))

unix 而不是else

如果我在导出之前在 linux 块中输入 message($$QMAKE_POST_LINK),在输出中我会有这样的消息:

cp /home/user/QtProject/projects/Tools/qmldir /home/user/QtProject/qml/Tools/
cp /home/user/QtProject/projects/Tools/Tools.qml /home/user/QtProject/qml/Tools/

像这样输出grep "qmldir" -C 5 <my_build_dir>/Makefile(与grep "Tools\.qml" -C 5 <my_build_dir>/Makefile相同):

.c.o:
    $(CC) -c $(CFLAGS) $(INCPATH) -o "$@" "$<"

####### Build rules

$(TARGET): /home/user/QtProject/projects/Tools/qmldir /home/user/QtProject/projects/Tools/Tools.qml $(OBJECTS)  


Makefile: ../../../projects/Tools/Tools.pro /home/user/Qt/5.4/gcc_64/mkspecs/linux-g++/qmake.conf /home/user/Qt/5.4/gcc_64/mkspecs/features/spec_pre.prf \
        /home/user/Qt/5.4/gcc_64/mkspecs/common/shell-unix.conf \
        /home/user/Qt/5.4/gcc_64/mkspecs/common/unix.conf \

【问题讨论】:

  • 1.为什么要在引号内添加\n\t? 2. 尝试将message($$from)message($$to) 添加到Linux 块中并重新运行qmake 以查看两个变量是否包含正确的值。其中一个是否包含空格?
  • 3.你想用for(entry,1) 做什么? 1 不是列表,是吗?
  • 在 linux 块中我写 message($$QMAKE_POST_LINK) 并且输出是正确的,如果我将该输出复制到终端 - 该代码工作正确。 \n\t 用于新行,在 1 行的 qmake_post_link 命令中没有它,并且 'cource 无法工作。 1 - 是列表,我告诉过 - 这在 Windows 中有效。
  • 输出是什么?请将其发布到问题中并ping我。您在终端中使用的外壳(bash?)可能与您的默认外壳(破折号?)表现不同。
  • 帖子已更新。 cp 是 coreutils 的一部分,不是吗?我不使用 bash。

标签: linux qt ubuntu qt-creator qmake


【解决方案1】:

不工作的项目是TEMPLATE类型“aux”,在不涉及编译器和链接器时使用。因此链接命令为空。

看起来QMAKE_POST_LINK只有在有链接命令时才被写入。

来自app_sandbox.pro 的生成文件(模板 = 应用程序):

####### Build rules

$(TARGET):  $(OBJECTS)  
    @test -d ../../bin/ || mkdir -p ../../bin/
    $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS)

Makefile: ../../projects/app_sandbox/app_sandbox.pro ../../../Qt/5.4/gcc_64/mkspecs/linux-g++/qmake.conf ../../../Qt/5.4/gcc_64/mkspecs/features/spec_pre.prf \

来自Controls.pro 的生成文件(模板 = aux):

####### Build rules

$(TARGET): /home/simon/nobackup/app_sandbox/projects/Design/Controls/qmldir /home/simon/nobackup/app_sandbox/projects/Design/Controls/TreeView.qml $(OBJECTS)  


Makefile: ../../../projects/Design/Controls/Controls.pro ../../../../Qt/5.4/gcc_64/mkspecs/linux-g++/qmake.conf ../../../../Qt/5.4/gcc_64/mkspecs/features/spec_pre.prf \

如您所见,两者都为目标指定了依赖项(在$(TARGET): 之后),但秒 Makefile 中没有链接命令。

【讨论】:

  • 但是在TEMPLATE 中输入“aux”而不是“仅限Windows”,为什么它只适用于Windows?我不明白。你的意思是,如果我使用“aux”类型,我不能像在 Windows 中那样创建项目?还是我必须写链接命令?
  • 我不知道为什么我在 Windows 上工作。可能是一些 qmake 内部原因。您需要找到另一种方法将复制命令写入 aux 模板。
  • 我试试,谢谢帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-13
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多