0

生成された Visual Studio ソリューションでプロジェクトの依存関係を設定する TEMPLATE = subdirsような .pro ファイルを設定することは可能ですか?qmake -tp vc

CONFIG += ordered正しい順序でエントリを続けて使用しようとしSUBDIRS += <libdir>ましたが、これはソリューション プロパティ ダイアログの [プロジェクトの依存関係] 設定に影響を与えないようです。

ありがとう!

4

1 に答える 1

0

誰もまだ解決策を見つけていないようなので、私は自分の質問に答えています。私の知る限り、QT .pro ファイルを使用して Visual Studio プロジェクトの依存関係を設定する方法はまだありません。プロジェクトのビルドが完了した後、手動でこれを行うために、開発した実行可能ファイル (Qt も使用) を使用しています。実行可能ファイルのビルドに使用されるコードは、Visual Studio 2010 ソリューションで機能し、以下に表示されます。これはかなり単純で、含まれるすべてのプロジェクトがコマンド ラインで入力されたすべてのプロジェクトに依存するようにソリューションを更新します。すなわち。vcSlnDependencies filename.sln dependency1 dependency2 dependency3filename.sln 内のすべてのプロジェクトを、依存関係 1、依存関係 2、および依存関係 3 に依存するように設定します。明らかに、プロジェクトがそれ自体に依存するように設定されることはありません。このコードは、より複雑な依存構造を可能にするために簡単に変更できる必要があります。

#include <QFile>
#include <QDir>
#include <QFileInfo>
#include <QStringList>
#include <QUuid>
#include <QTextStream>

#include <iostream>
#include <vector>
#include <map>

std::map<QString, QString> dependencyGuids;
std::vector<QString> dependencies;

int main(int argc, char *argv[])
{
    if(argc<3)
    {
        std::cout << "Usage:" << std::endl << std::endl << "vcSlnDependencies filename.sln dependency1 dependency2 dependency3 ..." << std::endl;

        return -1;
    }
    else
    {
        for(int i = 2; i < argc; i++)
        {
            dependencies.push_back(argv[i]);
        }
    }

    QFile file(argv[1]);
    if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        std::cout << "Could not open sln file: " << argv[1] << "." << std::endl;
        return -1;
    }

    QFileInfo fileInfo(file);

    std::cout << "Processing " << fileInfo.fileName().toStdString() << std::endl;

    QByteArray fileData;
    fileData = file.readAll();
    file.close();

    QFile outFile(argv[1]);
    if(!outFile.open(QIODevice::WriteOnly | QIODevice::Text))
    {
        std::cout << "Could not open sln file: " << argv[1] << "." << std::endl;
        return -1;
    }

    QTextStream reader(fileData);
    QTextStream writer(&outFile);

    //first populate the dependency guids
    while(!reader.atEnd())
    {
        QString currentLine = reader.readLine();

        for(unsigned int i = 0; i < dependencies.size(); i++)
        {
            if(currentLine.contains(dependencies[i]) && currentLine.contains(".vcxproj") && currentLine.contains("Project(\"{"))
            {
                dependencyGuids[dependencies[i]] = currentLine.right(39).left(38);
                std::cout << "Setting dependency GUID for " << dependencies[i].toLatin1().data() << " to " << currentLine.right(39).left(38).toLatin1().data() << "\n";
            }
        }               
    }
    reader.seek(0);

    //now update other projects with those dependencies
    while(!reader.atEnd())
    {
        QString currentLine = reader.readLine();

        writer << currentLine << "\n";

        if(currentLine.contains(".vcxproj") && currentLine.contains("Project(\"{"))
        {
            QString currentGuid = currentLine.mid(9,38);

            std::vector<QString> currentDependencies;

            for(std::map<QString, QString>::const_iterator iter = dependencyGuids.begin(); iter != dependencyGuids.end(); ++iter)
            {
                if(iter->second != currentGuid)
                {
                    currentDependencies.push_back(iter->second);
                }
            }

            if(currentDependencies.size() > 0)
            {
                writer << "\tProjectSection(ProjectDependencies) = postProject\n";

                for(unsigned int i = 0; i < currentDependencies.size(); i++)
                {
                    writer << "\t\t" << currentDependencies[i] << " = " << currentDependencies[i] << "\n";                  
                }

                writer << "\tEndProjectSection\n";
            }
        }       
    }

    writer.flush();
    outFile.close();

    return 0;
}
于 2013-01-23T16:46:51.860 に答える