Cでのライブラリのリンクに関する質問


8

LinuxでGCCコンパイラを使用してC(まだ初心者)を学んでいます。math.hヘッダーで使用されるライブラリなど、一部のライブラリを含める場合は、手動でリンクする必要があることに気付きました。上記の数学ライブラリ-l[library-name]など、さまざまな形式のフラグを使用してライブラリをリンクしてい-lmます。

ただし、コマンドラインからおよび/または切り替えた後GeanyCode::Blocks、私は気づいCode::Blocks用途は、g++プログラムをコンパイルする代わりに、gcc私は(プロジェクトが間違いなくCとして指定されているにもかかわらず)に慣れていること。また、Code::Blocksそのような数学ライブラリなどのライブラリ-手動でコンパイルする際にリンクするライブラリを必要としないだけで仕事を

2つの質問があります。

まず、g++コンパイラでCプログラムをコンパイルするのは「悪い」のでしょうか。これまでのところそれは動作するようですが、結局のところ、C ++はCではなく、g++コンパイラーがC ++用であることを確信しています。

次に、g++ライブラリの自動リンクを実行しているのはコンパイラCode::Blocksですか?


1
Code:Blocksは、そのビルド環境でライブラリのパスを検索するためにいくつかの環境変数を設定するか、コンパイラを呼び出すときにこの情報を追加すると思います。コマンドラインでも同様の結果が得られます。おそらく、Code:Blocksには、ビルド環境に関するそのような詳細を定義できるいくつかの設定オプションがあります。同様の情報を.bashrc(またはその他のiniスクリプト)に入れても、同じ結果が得られます。たぶん、Code:Blocksコンパイル出力を冗長に設定して(可能な場合)、正確に何が行われるかを確認します。
thorstenmüller2012年

私は、このリンクはあなたにいくつかの助けを与えるとしていることが理由++グラムでコンパイルしながら、私たちはいなくて、手動でリンク数学ライブラリ:stackoverflow.com/questions/1033898/...

回答:


6

gccとg ++はどちらもGNUコンパイラコレクションのフロントエンドです。Cコードのコンパイルとリンクには前者を使用し、C ++コードで同じアクションを実行するには後者を使用する必要があります。区別を維持するための最も強力な議論の1つは、CがC ++のサブセットではないということです

g ++を使用してリンクすると、C ++標準ライブラリに自動的にリンクされます。C標準ライブラリはC ++標準ライブラリの一部であるため、数学ライブラリも含まれています。これが、数学ライブラリを手動でリンクする必要がない理由です。


3

まず、Cプログラムをg ++コンパイラでコンパイルすることは「悪い」のでしょうか。

「悪い」を定義します。

有効なCプログラムが異なるセマンティックでC ++でコンパイルされる原因はいくつかありますが、私の経験が適切であれば、Cコンパイラのバージョンを変更するときに、UBが異なるために、UBが異なる方法で処理される可能性が高くなります。

C ++コンパイラは一部の有効なCプログラムをコンパイルしないため、C ++コンパイラでCをコンパイルすると、共通サブセットに制限されます。これは、Cのより厳密なバージョンです。C方言に制限することは慣用的ではありません(主な違いは別のポインター型が必要な場合はvoid *をキャストする必要があります)キャストしますが、かなりの数のプロジェクトがその方法でC ++を使用し始めました。C ++コンパイラを使用してよりタイプセーフなバージョンのCを取得し、追加機能を適切であると判断したため、1つずつ追加機能の使用を許可することにしました。(最新でより一般的な例はgcc自体です。GCCはK&R Cで記述され始め、その後ANSI Cコンパイラーを義務付けられ、その後ANSI CおよびC ++の共通サブセットに制限されましたが、現在は別のC ++を使用し始めていますかなり一般的な例は、K&の第2版の例です。

C ++コンパイラのみを使用する場合は、C ++依存関係をすぐに導入することに注意してください。

また、C99とC11の新しいものは、C ++では異なる場合があることに注意してください。

次に、Code :: Blocksでライブラリの自動リンクを行っているのはg ++コンパイラですか?

リンクに使用すると、コンパイラーは常にデフォルトのライブラリーのセットをリンクします。gccのセットにはlibmは含まれていません。g++のデフォルトセットに含まれています。追加のライブラリが必要な場合、G ++は追加のライブラリを自動検出しません(AFAIKもCode :: Blocksもしません)。これlibmは非常に特殊なケースです(デフォルトでgccがリンクしないという事実はgccのバグであると主張する人もいます)。


「gccがデフォルトでリンクしないという事実はgccのバグであると主張する人もいます」の+1。私はまったく同じライブラリで同じ問題に遭遇し、2つのコンパイラの違いを尋ねるためにここに来ました。
リスター氏2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.