Skip to content

Instantly share code, notes, and snippets.

@ramntry
Created April 3, 2012 21:39
Show Gist options
  • Save ramntry/2295698 to your computer and use it in GitHub Desktop.
Save ramntry/2295698 to your computer and use it in GitHub Desktop.
Templates and Qt's Meta Object System linking errors
#!/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}
#!/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
@ramntry
Copy link
Author

ramntry commented Apr 3, 2012

Скрипт qt_allow_multiple_definitions.sh вносит измения в автоматически сгенерированный утилитой qmake Makefile,
конфигурируя линковку проекта на автоматическое разрешение конфликтов, связанных с multiple definitions. Страница
руководства man утилиты ld в соответсвующем разделе выглядит следующим образом:

-z muldefs
           Normally when a symbol is defined multiple times, the linker will report a fatal error.
           These options allow multiple definitions and the first definition will be used.

Достаточно запустить скрипт в папке с Makefile и пересобрать проект командой make. Если Makefile еще не создан,
необходимо действовать обычным образом:

qmake -project или qmake -project "CONFIG += qtestlib" для включения поддержки QTestLib
./qt_allow_multiple_definitions.sh

@ramntry
Copy link
Author

ramntry commented Apr 3, 2012

Скрипт custom_moc_script.sh осуществляет попытку самостоятельно собрать проект без помощи утилит qmake и make.
Очевидно, работать этот прием будет только для крайне небольших проектов. Скрипт самостоятельно вызывает утилиту
moc и включает результаты ее работы во временные копии файлов исходных кодов, затем компилирует полученные
файлы, избегая проблем с повторным включением одного и того же кода в объектные файлы.

@ramntry
Copy link
Author

ramntry commented Apr 3, 2012

BUG
Скрипт custom_moc_script.sh на данный момент корректно работает только при условии, что все заголовочные
и *.cpp-фалы в *.pro-файле проекта указаны в одной строке с ключевым словом HEADERS или SOURCES.

@ramntry
Copy link
Author

ramntry commented Apr 11, 2012

Еще один, во многом более цивилизованный способ решения проблемы (см. последние строки поста)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment