Qt的代码块 - 非常错误

时间:2011-11-04 19:43:17

标签: qt codeblocks

在codeblocks中创建qt项目并运行它之后我得到了:
enter image description here

任何人都知道如何解决它? 感谢

2 个答案:

答案 0 :(得分:4)

这让我觉得你正在构建一个版本的Qt并在运行时链接另一个版本。运行QtSDK维护工具并删除不需要的任何版本的Qt桌面。然后,您可能需要在正确的标头处重新编写代码块。

我猜测如果你在Codeblocks中运行,你必须明确指定在运行新构建的应用程序时使用哪些dll。如果是这样,请确保它们是正确的版本(即用 QT INSTALL DIR \ Desktop \ 4.7.x \ mingw \ bin 替换dll [虽然我不在我的工作PC上那一刻,所以这条路可能有点错误。只要确保你在正确的 4.7.x 文件夹中)。

老实说,如果你是从Windows运行,为什么不使用QtCreator?除了略微缺乏GDB集成方面,它还是相当不错的,你会发现这样的问题更难以解决。

答案 1 :(得分:0)

这是(特别是在Windows上)一个常见问题。安装Qt SDK时,您将获得至少2个具有相同名称但版本不同的.dll。碰巧,您链接到预期的(dev-)lib,但在运行时使用Designer / Creator的版本。

避免这种情况的最简单方法是将dll的正确版本与二进制文件(.exe和stuff)一起部署在一个单独的文件夹中。这可以通过修改构建脚本来实现。这取决于您的构建系统,通常是qmake / .pro或cmake / CMakeLists.txt。

至于CMake,给定一个环境变量MYQTDLLDIR,其中包含要部署的文件的路径,你可以使用类似的东西:

configure_file($ENV{MYQTDLLDIR}/QtCore4.dll ${CMAKE_CURRENT_BINARY_DIR} COPYONLY)
configure_file($ENV{MYQTDLLDIR}/QtGui4.dll ${CMAKE_CURRENT_BINARY_DIR} COPYONLY)

文档摘自cmake --help-full

  

configure_file将文件复制到另一个位置并修改它   内容。

     

configure_file(                     [COPYONLY] [ESCAPE_QUOTES] [@ONLY])

     

将文件复制到文件并替换变量   文件内容中引用的值。如果是亲戚   路径是根据当前源目录进行评估的。   必须是文件,而不是目录。如果是   它是相对于当前二进制文件计算的相对路径   目录。如果为输入文件命名现有目录   以原始名称放在该目录中。

     

此命令替换引用的输入文件中的所有变量   $ {VAR}或@ VAR @及其值由CMake确定。如果是   变量未定义,它将被替换为空。如果
  指定COPYONLY,则不会发生变量扩展。如果   指定ESCAPE_QUOTES,然后任何替换的引号将是C风格   逃过一劫。该文件将配置CMake的当前值   变量。如果指定了@ONLY,则只显示@ VAR @
形式的变量   将被替换,$ {VAR}将被忽略。这对于有用   配置使用$ {VAR}的脚本。任何#cmakedefine的出现   VAR将替换为#define VAR或/ * #undef VAR * /
  取决于CMake中VAR的设置。任何出现的   #cmakedefine01 VAR将替换为#define VAR 1或   #define VAR 0>取决于VAR评估为TRUE还是FALSE   CMake的

至于qmake,您可以使用INSTALLS(在调用make install时使用)或在链接后执行“普通命令”。使用INSTALLS

mytarget.path = /output/path
mytarget.files += /path/to/QtCore4.dll
mytarget.files += /path/to/QtGui4.dll
INSTALLS += mytarget

qmake使用命令执行:

win32 {
    EXTRA_BINFILES += \
        $${MYQTDLLDIR}/QtCore4.dll \
        $${MYQTDLLDIR}/QtGui4.dll
    EXTRA_BINFILES_WIN = $${EXTRA_BINFILES}
    EXTRA_BINFILES_WIN ~= s,/,\\,g
        DESTDIR_WIN = $${DESTDIR}
    DESTDIR_WIN ~= s,/,\\,g
    for(FILE,EXTRA_BINFILES_WIN){
                QMAKE_POST_LINK +=$$quote(cmd /c copy /y $${FILE} $${DESTDIR_WIN}$$escape_expand(\n\t))
    }
}