gcc gccをコンパイルすると、「Cリンクを含むテンプレート」および「Cリンクを含むテンプレートを特殊化する」エラーが発生しました。

gcc gccをコンパイルすると、「Cリンクを含むテンプレート」および「Cリンクを含むテンプレートを特殊化する」エラーが発生しました。

Ubuntu 14.04 LTSを使用しています。これはパッケージに出荷されました。gcc 4.8.4しかし、私はより高いバージョンが欲しいですgcc


既存のバージョン4.8.4を使用して構築しました。4.9.4ソースコードから渡されました推奨チェーンコンパイル - ビルド - テスト - インストール./configureプレフィックスディレクトリとプログラムサフィックス以外の外部設定は使用しません。残りはデフォルトです。すべてがうまくいっているようです。テストの概要にはg++FAILがなく、XPASS呼び出しは2回だけ表示されます。

XPASS: g++.dg/tls/thread_local-order2.C -std=c++11 execution test
XPASS: g++.dg/tls/thread_local-order2.C -std=c++1y execution test

その後、バージョンを作成したいと思います。5.4.0新しくインストールされた4.9.4を使用して、最小限の学習曲線で後者をテストします。makeフラグとCCこれらCXXのフラグは4.9.4インストールディレクトリのバイナリを指します。

これ構成5.4.0 段階は順調に進んでいます。ファイルから新しいバイナリへのパスが正しく読み取られているconfig.logことを確認しました。Makefile

これ立てるただし、手順が失敗し、stderr約100個のエラーが報告されます。最も初期で最も頻繁なタイプは次のとおりです。

`error: template with C linkage`
`error: template specialization with C linkage`

次のブロックで提供されます。

In file included from ${installation directory for 4.9.4}/include/c++/4.9.4/bits/stringfwd.h:40:0,
             from ${installation directory for 4.9.4}/include/c++/4.9.4/iosfwd:39,
             from /usr/include/x86_64-linux-gnu/gmp.h:25,
             from /usr/local/include/isl/val_gmp.h:4,
             from ${source directory for 5-4-0}/gcc/graphite-isl-ast-to-gimple.c:35:

${installation directory for 4.9.4}/include/c++/4.9.4/bits/memoryfwd.h:63:3: error: template with C linkage
   template<typename>
   ^
${installation directory for 4.9.4}/include/c++/4.9.4/bits/memoryfwd.h:66:3: error: template specialization with C linkage
   template<>
   ^
${installation directory for 4.9.4}/include/c++/4.9.4/bits/memoryfwd.h:70:3: error: template with C linkage
   template<typename, typename>
   ^

5.4.0ソースコードは4.9.4と同じようにすべての情報を収集して処理するので良いと思います。 4.9.4、5.4.0、またはその両方の構成段階でエラー/欠落がある可能性があります。

これらのエラーはどのような欠陥を示しますか?どうすれば修正できますか?

あなたの考えに感謝します。


StackExchangeの検索クエリでは、error: template with C linkage約171,000件の結果が出ました。私が見つけた投稿ではこの問題に対処しないようです。

https://stackoverflow.com/questions/29872494/compiling-a-program-under-windows-gives-a-bunch-of-error-template-with-c-linka

https://stackoverflow.com/questions/4115930/using-cygwin-to-build-template-with-c-linkage

私はコードを分類することに興味がなく、むしろ(強力な)動作するコンパイラを設定することに興味があります。

ベストアンサー1

--with-local-prefix=/usrこの問題は、シェルスクリプトのコンパイルスイッチを設定することで回避されましたconfigure。既定値/usr/localはで、Ubuntu は検索するファイルを次の場所に保存するようです。/usrhttps://unix.stackexchange.com/a/346171/132913)

ただし、この設定はお勧めできません。よりGCCオンライン設定ヘルプ:

--with-local-prefix=ディレクトリ名

ローカルインクルードファイルのインストールディレクトリを指定します。デフォルトは/usr/localです。。コンパイラーにディレクトリーを検索させるには、このオプションを指定します。ディレクトリ名/含む代わりにローカルにインストールされたヘッダファイルの場合/usr/ローカル/含む

サイトにサイト固有のファイルを配置する場所に関する別の規則がある場合にのみ、--with-local-prefixを指定する必要があります(/usr/localを除く)。

--prefixの値に関係なく、--with-local-prefixのデフォルト値は/usr/localです。 --prefix を指定すると、GCC はローカルヘッダファイルを検索するディレクトリには影響しません。これは反直観的に見えるかもしれませんが、実際には論理的です。

--prefixの目的は、GCCがインストールされている場所を指定することです。 /usr/local/includeのローカルヘッダーファイル(そのディレクトリにファイルを配置した場合)はGCCの一部ではありません。それらは他のプロジェクトの一部です。おそらく他の多くのプロジェクトでしょう。 (GCCは--prefix値に基づいて別のディレクトリに独自のヘッダファイルをインストールします。)

ローカルプレフィックスを含むディレクトリとGCCプレフィックスを含むディレクトリは、両方ともGCCの「システムを含む」ディレクトリの一部です。これら2つのディレクトリは固定されていませんが、include_nextディレクティブが正しく処理されるように正しい順序で検索する必要があります。ローカルプレフィックスを含むディレクトリは、GCCプレフィックスを含むディレクトリの前に検索されます。システムインクルードディレクトリの別の機能は、これらのディレクトリのヘッダーに関する賢明な警告がオフになることです。

一部のautoconfマクロは、インストールされたパッケージヘッダーを含むディレクトリを検索するために、コンパイラコマンドラインに-Iディレクトリオプションを追加します。ディレクトリがGCCのシステムインクルードディレクトリの1つである場合、GCCはシステムオプションが正しい順序で処理され続けるようにこのオプションを無視します。これにより、検索順序が指定された順序と異なる場合がありますが、ディレクトリは引き続き検索されます。

GCC は GCC_EXEC_PREFIX を使用して共通ライブラリを自動的に検索します。したがって、GCCとパッケージが同じインストールプレフィックスを使用すると、GCCは自動的にヘッダーとライブラリを検索します。これは使いやすい設定を提供します。 GCCは、/ usrにシステムコンパイラとしてインストールされている場合と同様に機能します。

複数のバージョンのGCCをインストールする必要があるサイトでは、上記の簡単な設定を使用しないことがあります。 --program-prefix、--program-suffix、および--program-transform-nameオプションを使用して複数のバージョンを単一のディレクトリにインストールできますが、他のプレフィックスと--with-local-を使用する方が簡単です。あります。プレフィックスオプションが指定されました。各バージョンのサイト別ファイルの場所。次に、ユーザーはローカルサイトライブラリの場所を明示的に指定する必要があります(たとえば、LIBRARY_PATHを使用)。

/usrでない場合は、--with-local-prefixと--prefixに同じ値を使用できます。これは、/usr/local/include の基本的な検索を防ぐために使用できます。

/usr を --with-local-prefix として指定しないでください。 --with-local-prefixに使用されるディレクトリには、システムの標準ヘッダファイルが含まれてはいけません。一部のプログラムは、そのプログラムを含む場合(一部のターゲットのGNU Emacsを含む)、誤ってコンパイルされます。これは、fixincludesスクリプトによって変更されたヘッダーファイルを上書きして元に戻すためです。

このオプションを使用している人は、目的に対する誤解のためにこのオプションを使用しているという兆候があります。人々は、GCCの一部がインストールされる場所を指定するのと同じようにそれを使用します。たぶんGCCをインストールするとディレクトリが作成されるので、この仮定をしたかもしれません。

これらの矛盾については、近いうちに他の記事で取り上げます。

おすすめ記事