windows - 환경설정 - qt 크로스컴파일




win7 32 비트에 Qt 앱 배포-Win7 x64에서 작동(및 컴파일) (2)

글쎄, 나는 해결책을 찾고 하루를 보내고 모든 것을 읽었지 만 Qt 어플리케이션을 배치 할 수 없어서 물어보기로했다.

VS 2013 Ultimate에서 Visual Studio Add-In을 통해 Qt 5.2.1을 사용하고 있습니다. Qt 버전은 msvcr2012입니다. Qt 5.2의 x86 버전이 있습니다 (현재 Qt 다운로드 페이지의 맨 아래부터 3 번째 버전입니다).

Win7 32 비트를 대상으로합니다.

내 OS는 Windows7 64 비트이고, 링크 된 라이브러리와 함께 win32 , release /o2 (max speed) 최적화, /MD (dynamic C runtime) 용 앱을 구축하고 있습니다.

qtmain.lib
Qt5Core.lib
Qt5Gui.lib
Qt5Widgets.lib
Qt5PlatformSupport.lib //this one is added by me, the others are automatically set with the Qt-AddIn template.

나는 그것을 빌드하고 릴리스 폴더에 다음을 넣는다.

편집 : 내 컴파일러 버전 때문에, 나는 또한 vs2012 dll.s을 배포합니다.

.../release                                            /plugins        /platforms

나는 addittional library path를 다음과 같이 설정했다.

void registerPluginsDir(QDir& exeDir)
{
QString pluginsRelPath = "plugins";
QString platformsRelPath = "platforms";
QString pluginsPath = exeDir.absoluteFilePath(pluginsRelPath);
QString platformsPath = QDir(pluginsPath).absoluteFilePath(platformsRelPath);
QStringList pathes = QCoreApplication::libraryPaths();
pathes << pluginsPath;
pathes << platformsPath;
QCoreApplication::setLibraryPaths(pathes);

for (auto i : pathes)
    qDebug() << i << "\n";
};

int main(int argc, char *argv[])
{
    QString exePath = QString::fromUtf8(argv[0]);
    QFileInfo exeInfo(exePath);
    QDir exeDir(exeInfo.absolutePath());
    registerPluginsDir(exeDir);

    QApplication a(argc, argv);
    KeyGenerator w;
    w.show();
    return a.exec();
};

가청은 맞습니다. 디버거를 사용하여 Qt 메인 폴더가 아니라 내 앱 폴더에서로드 된 것을 보았습니다.

depends.exe로 나는 모든 것을 검사했다. 나는 단지 2 경고, 오류가 발생하지 않습니다 :

Warning: At least one delay-load dependency module was not found.
Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module.

Visual Studio에서 app을 디버깅 할 때로드 된 .dll에 따라 .dll을 복사했습니다. depends.exe와 디버그 사이의 유일한 차이점은 VS system dll-s에서 system32가 아닌 SysWOW64에서로드된다는 것입니다.

이 모든 내 (개발자) PC에 withouth 어떤 오류가 실행되지만 테스트 (Win7 32 비트 Microsoft 가상 PC에서 실행)에서 PC '악명 높은'오류가 발생합니다.

Failed to load platform plugin windows”. Available platforms are:
(and here there are the full pathes to the .dll-s, 
eg: D:\cproj\keygen\win32\Release\plugins\platforms\qwindows.dll, so it must have found them.

나는 이것을 따라 갔다 : http://qt-project.org/wiki/Deploy_an_Application_on_Windows .
Qt-dir의 이름이 변경되면 콘솔은 릴리스 폴더를 라이브러리 입력으로 만 출력합니다 (첫 번째 테스트와 같은 Qt- 폴더가 아님). 그것은 응용 프로그램 폴더에서 dll을로드, 잘 발사했다. 그러나, 내 가상 PC, 또는 내 동생의 PAC (Win7 32 비트) 그것은 내게 오류를 제공합니다. 이것에 대한 그림 :

32 비트 컴퓨터에서 실행하는 방법? 나는 모든 빌드, 릴리스 -win32, 디버그 -win32와 함께 시도했지만 그 중 아무 것도 작동하지 않습니다. 더 많은 컴퓨터에서 테스트 할 수는 없지만 XP에서는 C 런타임을로드 할 수 없지만 대상 플랫폼은 아닙니다.

더 많은 정보를 원하시면 의견을주십시오.

편집 : 대상 PC의 종속성 워커는 dev pc와 동일하게 표시됩니다. 플러그인을 찾았지만로드 할 수 없습니다.


나는 당신이 경로 설정 등을 왜 귀찮게하는지 모르겠다. 링크 된 Qt 위키 기사에서는 plugins 폴더가 없다는 것을 보여 주지만 그 폴더의 모든 것은 실행 파일의 폴더에 있어야한다.

그들이 제공하는 조언은 매우 간단합니다.

  1. Qt의 bin 디렉토리에있는 모든 .dll 은 실행 파일의 폴더에 복사해야합니다.

  2. Qt의 pluginsqml 폴더에있는 모든 파일과 폴더는 실행 파일의 폴더에 복사해야합니다.

그런 다음 사용하지 않는 모듈로 잘라낼 수 있습니다. 저를 위해 일하십시오, 좋습니다.

"상업용 버전을 사용하지 않기 때문에 릴리스 빌드에 .dll-s를 추가해야합니다."라고 말하는 것도 잘못되었습니다. 조언따르는 경우 Qt 5 및 MSVC 2012를 사용하여 정적으로 링크 된 실행 파일을 쉽게 구축 할 수 있으며 Windows XP를 모두 대상으로하는 방법에 대한 세부 정보도 제공합니다. 그리고 LGPL의 관점에서 잘 할 수 있습니다. 사용자가 프로젝트를 다시 링크하도록해야합니다 (C ++ 소스를 제공한다는 의미는 아닙니다!).


문제는 플러그인과 관련이 없었지만 VS2010이 다시 요청했습니다.
모든 것을 시도한 후에 Qt 폴더에서 찾은 다음 설치하여 내 응용 프로그램을 실행 해 보았습니다. 이제는 버추얼 PC에서도 실행되지만, 의존성에 나열되어 있지 않습니다. 2012 및 2013 버전 만 나열했습니다.





deployment