「Qtの設定 - エラー」の版間の差分

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
ナビゲーションに移動 検索に移動
54行目: 54行目:


== QMLのコンパイルエラー ==
== QMLのコンパイルエラー ==
RESOURCES変数に重複した値がある場合、以下に示すエラーが発生する。<br>
変数<code>RESOURCES</code>に重複した値がある場合、以下に示すエラーが発生する。<br>
  redefinition of 'int qInitResources_qml()'
  redefinition of 'int qInitResources_qml()'
<br><br>
<br><br>
== リンカーエラー : undefined reference to 'vtable for 〜' ==
該当のソースファイルにおいて、mocファイルを直接インクルードする。<br>
<syntaxhighlight lang="c++">
// *.cppファイル
class SampleClass : public QObject
{
    Q_OBJECT
    // ...略
};
int main(int argc, char *argv[])
{
    // ...略
}
// mocファイルを明示的にインクルード
#include "main.moc"
</syntaxhighlight>
<br>
<code>#include "main.moc"</code>は、Qtのメタオブジェクトコンパイラ(moc)により生成されたメタデータを含むソースファイルを現在のファイルに含めるために使用される。<br>
このメタデータは、Qtのシグナルとスロットのメカニズム、QObjectクラスの継承、および、<code>Q_OBJECT</code>マクロの使用に関連している。<br>
<br>
<code>Q_OBJECT</code>マクロを含むクラスが存在する場合、mocファイルが自動生成されてプロジェクトのビルドプロセスに自動的に組み込まれる。<br>
一般的に、mocファイルは自動的に処理されるため、mocファイルを明示的にインクルードする必要はない。<br>
<br>
しかし、特定のケースでは、mocファイルを明示的にインクルードする必要がある。<br>
これは、以下に示すような状況で発生する。<br>
* ソースファイル (cpp拡張子) が<code>Q_OBJECT</code>マクロを含むクラス定義とその実装を両方を含んでおり、<br>プロジェクトファイル(.proまたはCMakeLists.txt)において、ヘッダファイルとしてではなくソースファイルとしてリストされている場合。
* ソースファイルがテンプレートクラスや特殊なビルドシナリオを含む等、mocによる自動処理が適切に行われない場合。
<br>
ソースファイルにおいて、<code>#include "main.moc"</code>を明示的に使用する必要があるかどうかを確認する場合は、<br>
クラスの定義と実装が同じソースファイル内にあり、かつ、ソースファイルがmocプロセスによって自動的に処理されない状況にあるかどうかに依存する。<br>
<br>
多くのQtプロジェクトでは、ソースファイルとヘッダファイルを分けて、明示的なmocファイルのインクルードを避ける慣習がある。<br>
その場合、qmakeコマンドやcmakeコマンドは、必要なmoc処理を自動的に行うため、mocファイルを直接インクルードする必要はない。<br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:Qt]]
[[カテゴリ:Qt]]

2024年3月1日 (金) 15:58時点における版

概要

ここでは、Qt CreatorおよびQt Designerに関する様々なエラーと解決方法を記載する。


エラー : LNK1158

エラー内容

fatal error LNK1158: cannot run ‘rc.exe’が発生する


解決方法

C:\Program Files (x86)\Windows Kits\<バージョン名>\bin\x64ディレクトリにあるrc.exeとrcdll.dllを
C:\Program Files (x86)\Microsoft Visual Studio <バージョン名>\VC\bin\amd64にコピーする。


詳細は、以下のWebサイトを参照すること。
http://motchy99.blog.fc2.com/blog-entry-97.html


エラー : LNK2005

エラー内容

fatal error LNK2005 * mainwindow.obj:-1: エラー: LNK2005: "class QDataStream & __cdecl operator<<(class QDataStream &,class Person const &)" (??6@YAAEAVQDataStream@@AEAV0@AEBVPerson@@@Z) は既に main.obj で定義されています。


解決方法

多重インクルードが発生しているため、多重インクルードを回避する。



Qt WebEngine使用時のビルドエラー

Qt 5において、Qt WebEngine(QWebEngineViewクラス等を使用して、QT += webengineを有効にする時)を使用してビルドする時、以下に示すようなビルドエラーが発生する場合がある。

# ビルドエラーの例

/usr/bin/ld: /<Qt 5のインストールディレクトリ>/<Qt 5のバージョン>/gcc_64/lib/libQt5WebEngineCore.so: .dynsym local symbol at index 3 (>= sh_info of 3)
/usr/bin/ld: /<Qt 5のインストールディレクトリ>/<Qt 5のバージョン>/gcc_64/lib/libQt5WebEngineCore.so: .dynsym local symbol at index 5 (>= sh_info of 3)
/usr/bin/ld: /<Qt 5のインストールディレクトリ>/<Qt 5のバージョン>/gcc_64/lib/libQt5WebEngineCore.so: .dynsym local symbol at index 6 (>= sh_info of 3)
... 略


これを回避するには、以下に示す2つの方法がある。

  • 方法 1
    • まず、binutils-goldライブラリをインストールする。
      sudo zypper install binutils-gold
    • 次に、Qtプロジェクトファイル(.pro拡張子)において、リンカーフラグを設定する。
      CONFIG += use_gold_linker

  • 方法 2
    • まず、lldライブラリをインストールする。
      なお、LLVMのソースコードから、ビルドおよびインストールしてもよい。
      sudo zypper install lld
    • 次に、Qtプロジェクトファイル(.pro拡張子)において、リンカーフラグを設定する。
      CONFIG += use_lld_linker
    • もし、CMakeを使用している場合は、CMakeファイルにおいて、リンカーフラグを指定する。
      if (UNIX)
      set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=gold")
      set(CMAKE_CC_FLAGS "${CMAKE_CC_FLAGS} -fuse-ld=gold")
      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fuse-ld=gold")
      endif()



QMLのコンパイルエラー

変数RESOURCESに重複した値がある場合、以下に示すエラーが発生する。

redefinition of 'int qInitResources_qml()'



リンカーエラー : undefined reference to 'vtable for 〜'

該当のソースファイルにおいて、mocファイルを直接インクルードする。

 // *.cppファイル
 
 class SampleClass : public QObject
 {
    Q_OBJECT
 
    // ...略
 
 };
 
 int main(int argc, char *argv[])
 {
    // ...略
 }
 
 // mocファイルを明示的にインクルード
 #include "main.moc"


#include "main.moc"は、Qtのメタオブジェクトコンパイラ(moc)により生成されたメタデータを含むソースファイルを現在のファイルに含めるために使用される。
このメタデータは、Qtのシグナルとスロットのメカニズム、QObjectクラスの継承、および、Q_OBJECTマクロの使用に関連している。

Q_OBJECTマクロを含むクラスが存在する場合、mocファイルが自動生成されてプロジェクトのビルドプロセスに自動的に組み込まれる。
一般的に、mocファイルは自動的に処理されるため、mocファイルを明示的にインクルードする必要はない。

しかし、特定のケースでは、mocファイルを明示的にインクルードする必要がある。
これは、以下に示すような状況で発生する。

  • ソースファイル (cpp拡張子) がQ_OBJECTマクロを含むクラス定義とその実装を両方を含んでおり、
    プロジェクトファイル(.proまたはCMakeLists.txt)において、ヘッダファイルとしてではなくソースファイルとしてリストされている場合。
  • ソースファイルがテンプレートクラスや特殊なビルドシナリオを含む等、mocによる自動処理が適切に行われない場合。


ソースファイルにおいて、#include "main.moc"を明示的に使用する必要があるかどうかを確認する場合は、
クラスの定義と実装が同じソースファイル内にあり、かつ、ソースファイルがmocプロセスによって自動的に処理されない状況にあるかどうかに依存する。

多くのQtプロジェクトでは、ソースファイルとヘッダファイルを分けて、明示的なmocファイルのインクルードを避ける慣習がある。
その場合、qmakeコマンドやcmakeコマンドは、必要なmoc処理を自動的に行うため、mocファイルを直接インクルードする必要はない。