تلف الموارد .الملف cpp عند استخدام QT5_ADD_RESOURCES و multithread تجميع مع CMake

StackOverflow https://stackoverflow.com//questions/23041356

سؤال

5.0 الإفراج عن Qt جلبت مجموعة من أسهل الأوامر لبناء Qt المشاريع باستخدام CMake.انظر http://qt-project.org/doc/qt-5/cmake-manual.html.موارد المشروع تحتاج إلى تدرج باستخدام الأمر QT5_ADD_RESOURCES.

إذا كان بلدي الموارد ملف اسمه مثلا Icon32.الهلال الأحمر القطري ، QT5_ADD_RESOURCES(الموارد Icon32.الهلال) الأمر سيتم تحويل تلقائيا إلى qrc_Icon32.cpp ملف تعريف ${موارد} المتغير الذي سوف تكون بعد ذلك قادرة على أن تشمل في السليم الأهداف.

تفعل هذا يعمل تماما ، إلا أنني على خطأ في التجميع في CDash تقريبا مرة كل 20 يبني.الخطأ هو عادة من الشكل التالي:

/.../CMake/build/qrc_Icon32.cpp:272380:1: error: unknown type name 'qCleanupResources_Icon32'

ما يحدث هو أن متغير جزء من السطر الأخير من qrc_Icon32.cpp الملف تتكرر بعد ما ينبغي عادة نهاية الملف ، وبالتالي خلق واحد آخر لا معنى لها خط المترجم.

تسجيل ما CMake لا يبدو أن سلوك QT5_ADD_RESOURCES هو ما يلي:عندما تصل إلى المشروع الذي يتطلب موارد في السؤال ، فإنه ينفذ تعتمد جعل الملف غير محددة تجميع الهدف ولكن هذا لا يزال من شأنه أن أكتب qrc_Icon32.cpp في جذر بناء الدليل, و هذا على جميع الأهداف.حتى إذا هدفين يجري تجميعها في موازاة ذلك ، اثنين من الدعاء مجلس قيادة الثورة يمكن أن تكون الكتابة في نفس الملف في نفس الوقت ، ومن هنا جاء الفساد.

لم أجد أي تقرير/مناقشة هذه المسألة/ميزة على شبكة الإنترنت لذلك أنا أتساءل إذا كنت قد نسيت شيئا:

هل هناك طريقة لمعرفة CMake لإنقاذ ولدت qrc_Icon32.cpp في موقع مختلف عن كل هدف ؟ الأفضل من ذلك, هل من الممكن أن أقول CMake الاتصال مجلس قيادة الثورة مرة واحدة فقط من جعل الملف بحيث qrc_Icon32.cpp هو في وقت لاحق متاحة لجميع الأهداف ؟

أعتقد أن الحل سيكون لإنشاء مكتبة ثابتة من شأنها أن تكون واحدة فقط باستخدام ${موارد} ثم ربط تلك المكتبة في جميع الأهداف.ولكن لا زلت أعتقد CMake يجب أن تكون قادرة على إدارة تبعيات بشكل صحيح عند ترجمة مع خاصية تعدد -ي العلم.


إعادة إنشاء المشكلة, في مجلد فارغ, إنشاء CMakeList.txt التي تحتوي على ما يلي

CMAKE_MINIMUM_REQUIRED(VERSION 2.8.11)
PROJECT(SSCCE CXX)

set(CMAKE_PREFIX_PATH /usr/local/Qt-5.3.0 ${CMAKE_PREFIX_PATH})

set(CMAKE_AUTOMOC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)

INCLUDE_DIRECTORIES(SYSTEM "/usr/local/Qt-5.3.0/include/QtCore")
find_package(Qt5Core REQUIRED)
QT5_ADD_RESOURCES(RESOURCES Icon32.qrc)

SET(LIBLIST gobject-2.0 X11-xcb Xi xcb-render-util SM ICE xcb-glx xcb-render xcb-atom xcb-property xcb-event dbus-1 xcb xcb-image xcb-icccm xcb-sync xcb-xfixes xcb-shm xcb-randr xcb-shape xcb-keysyms fontconfig freetype Xrender Xext X11 jpeg png Qt5::Core z m dl gthread-2.0 rt glib-2.0 GL pthread)

ADD_EXECUTABLE(FirstTarget Main1.cpp ${RESOURCES})
TARGET_LINK_LIBRARIES(FirstTarget ${LIBLIST})
ADD_EXECUTABLE(SecondTarget Main2.cpp ${RESOURCES})
TARGET_LINK_LIBRARIES(SecondTarget ${LIBLIST})

ثم Main1.cpp و Main2.cpp يتم إنشاؤها باستخدام

#include <iostream>

using namespace std;

int main(int argc, char** argv) {
        std::cout<<"Hello World 1"<<std::endl;
        return 0;
}

فإن الهلال الأحمر القطري الملف

<RCC>
    <qresource prefix="/">
        <file>Icon32/YourImage.png</file>
    </qresource>
</RCC>

ثم إنشاء مجلد اسمه Icon32 وإضافة png صورة من اختيارك اسم YourImage.بابوا غينيا الجديدة.

وأخيرا إنشاء بناء الدليل ، أدخل وتشغيل:

cmake -DCMAKE_CXX_COMPILER=g++-4.8 -DCMAKE_CXX_FLAGS='-std=c++11 -fPIE' ..
make -j2

الإخراج ينبغي أن يكون شيء من هذا القبيل

Scanning dependencies of target FirstTarget_automoc
Scanning dependencies of target SecondTarget_automoc
[ 10%] [ 20%] Automoc for target FirstTarget
Automoc for target SecondTarget
[ 20%] [ 20%] Built target FirstTarget_automoc
Built target SecondTarget_automoc
[ 30%] [ 40%] Generating qrc_Icon32.cpp
Generating qrc_Icon32.cpp
Scanning dependencies of target SecondTarget
Scanning dependencies of target FirstTarget
[ 50%] [ 60%] Building CXX object CMakeFiles/SecondTarget.dir/Main2.cpp.o
Building CXX object CMakeFiles/FirstTarget.dir/Main1.cpp.o
[ 70%] [ 80%] Building CXX object CMakeFiles/SecondTarget.dir/qrc_Icon32.cpp.o
Building CXX object CMakeFiles/FirstTarget.dir/qrc_Icon32.cpp.o
[ 90%] [100%] Building CXX object CMakeFiles/SecondTarget.dir /SecondTarget_automoc.cpp.o
Building CXX object CMakeFiles/FirstTarget.dir/FirstTarget_automoc.cpp.o
Linking CXX executable SecondTarget
Linking CXX executable FirstTarget

يمكنك أن ترى أن qrc_Icon32.cpp يتم إنشاء مرتين في نفس الوقت ، في جذر بناء الدليل.على qrc_Icon32.cpp.o ملفات على الرغم من يتم إنشاؤها بشكل صحيح في FirstTarget.دير SecondTarget.dir لذلك هناك أي تعارض.

وجهة نظري هو أن إما:1) qrc_Icon32.cpp ينبغي أن تنشأ في FirstTarget.دير SecondTarget.dir كذلك أو 2) ينبغي أن يكون خلق في جذر بناء الدليل ، ولكن مرة واحدة فقط لجميع الأهداف.

هل كانت مفيدة؟

المحلول

qt5_add_resources يكتب الملف إلى CMAKE_CURRENT_BINARY_DIR, لا CMAKE_BINARY_DIR

https://qt.gitorious.org/qt/qtbase/source/d953d9a4c3bdc5ed3b8d380c4b893b51b523bc50:src/corelib/Qt5CoreMacros.cmake#L205

كما سبق كيو تي 4:

http://cmake.org/gitweb?p=cmake.git;a=blob;f=Modules/Qt4Macros.cmake;h=b1b12d68b07aac076719c681fb844f4f98ba8151;hb=HEAD#l212

تحديث:

مع التعليمات البرمجية المصدر التي قدمتها في التحديث ، فمن الممكن أن نرى هذه المسألة.

http://www.cmake.org/pipermail/cmake/2008-October/024492.html

http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=0ece8f79

http://public.kitware.com/Bug/view.php?id=12311

الحل هو إضافة الهدف المخصص وإضافة صريح يعتمد على ذلك.

cmake_minimum_required(VERSION 2.8.11)

project(MyTest)

find_package(Qt5Core)

qt5_add_resources(RSCS somefile.qrc)
add_custom_target(gen_qrc DEPENDS ${RSCS})

add_executable(foo foo.cpp ${RSCS})
add_dependencies(foo gen_qrc)
add_executable(bar bar.cpp ${RSCS})
add_dependencies(bar gen_qrc)

CMake 3.0 لديه AUTORCC الميزة:

http://www.cmake.org/cmake/help/v3.0/manual/cmake-qt.7.html#autorcc

فإنه يضع أيضا ولدت qrc_ الملف في بناء الحالي dir.CMake 3.1 في هدف محدد الدليل ، مما يجعل هذه المشكلة:

http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=33774ca2

نصائح أخرى

ذكرت السلوك هو يرجع ذلك إلى حقيقة أن QT5_ADD_RESOURCES ويسمى في وقت مبكر في عملية خلال التكوين و قبل تجميع يبدأ فعلا.عند هذه النقطة متغير ${CMAKE_CURRENT_BINARY_DIR} أشار steveire بأنها الجذر بناء المجلد.(هذا يمكن أن يكون بسهولة اختبارها عن طريق إضافة رسالة( الإخراج في Qt5CoreMacros.cmake.

نتائج وظيفة QT5_ADD_RESOURCES هو خلق العرف الأوامر التي سوف يطلق خلال عملية التجميع:https://qt.gitorious.org/qt/qtbase/source/d953d9a4c3bdc5ed3b8d380c4b893b51b523bc50%3asrc/corelib/Qt5CoreMacros.cmake#L231

إذا أهداف متعددة محددة ثم تلك أوامر مخصصة يمكن أن يكون بالتوازي في نفس الوقت.في تلك اللحظة ، ${outfile} لن يكون تعريف باستخدام الحالية ${CMAKE_CURRENT_BINARY_DIR} وبالتالي عمليات موازية سوف أكتب في نفس الملف في جذر بناء الدليل.

ابحث في الكود QT5_ADD_RESOURCES أي آلية/الخيار يبدو أن تكون متاحة لتصحيح هذا السلوك في حالة مؤشرات التجميع, ومع ذلك ، كما أشار steveire الحل الأساسي مخصص وظيفة الأوامر يمكن أيضا تطبيقها بنجاح.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top