Created
April 3, 2012 21:39
-
-
Save ramntry/2295698 to your computer and use it in GitHub Desktop.
Templates and Qt's Meta Object System linking errors
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/sh | |
PREFIX="__CMS__" | |
if [ -z $1 ] | |
then | |
PRO=`basename $PWD`.pro | |
else | |
PRO=$1 | |
fi | |
if [ ! -e $PRO ] | |
then | |
echo Usage: `basename $0` PRO_FILE | |
exit | |
fi | |
for f in `cat $PRO \ | |
| sed -r -n '/(HEADERS\s*\+=\s*.*$)|(SOURCES\s*\+=\s*.*$)/p' \ | |
| sed -r 's/\w+\s*\+=\s*//'` | |
do | |
cp $f $PREFIX$f | |
moc -nw $PREFIX$f >> $f | |
if echo $f | grep -q .cpp$ | |
then | |
g++ -c $f | |
fi | |
rm $f | |
mv $PREFIX$f $f | |
done | |
g++ *.o -o ${PRO%%.pro} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/sh | |
if [ ! -e Makefile ] | |
then | |
qmake | |
fi | |
mv Makefile Makefile.orig | |
cat Makefile.orig \ | |
| sed -r 's/(^LINK\s+=\s*)g\+\+(\s*$)/\1g++ -Xlinker -z -Xlinker muldefs\2/' \ | |
> Makefile |
Скрипт custom_moc_script.sh осуществляет попытку самостоятельно собрать проект без помощи утилит qmake и make.
Очевидно, работать этот прием будет только для крайне небольших проектов. Скрипт самостоятельно вызывает утилиту
moc и включает результаты ее работы во временные копии файлов исходных кодов, затем компилирует полученные
файлы, избегая проблем с повторным включением одного и того же кода в объектные файлы.
BUG
Скрипт custom_moc_script.sh на данный момент корректно работает только при условии, что все заголовочные
и *.cpp-фалы в *.pro-файле проекта указаны в одной строке с ключевым словом HEADERS или SOURCES.
Еще один, во многом более цивилизованный способ решения проблемы (см. последние строки поста)
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Скрипт qt_allow_multiple_definitions.sh вносит измения в автоматически сгенерированный утилитой qmake Makefile,
конфигурируя линковку проекта на автоматическое разрешение конфликтов, связанных с multiple definitions. Страница
руководства man утилиты ld в соответсвующем разделе выглядит следующим образом:
Достаточно запустить скрипт в папке с Makefile и пересобрать проект командой make. Если Makefile еще не создан,
необходимо действовать обычным образом:
qmake -project
илиqmake -project "CONFIG += qtestlib"
для включения поддержки QTestLib./qt_allow_multiple_definitions.sh