【初心者】Ubuntu Linux 126【本スレ】 (581レス)
前次1-
抽出解除 レス栞

69
(1): 04/30(木)14:14:39.44 ID:nVAHzhsH(1) AAS
3行で
75: 04/30(木)16:12:47.44 ID:lFYNk0IA(3/3) AAS
>>66
その時はまた別なものに移行すればいいと思うんだけどね。重要なのはオープン・ソースである事で、マイクロソフトが望まぬ事をしたらなら、そこからフォークさせていけば良い
341: 05/24(日)16:42:06.44 ID:SooJXv0m(8/8) AAS
gcc でプログラムをコンパイルする場合、ソースやヘッダで関数が複数回定義されることがあります。
昔は -z muldefs というオプションをつけると、一応はコンパイルが通りました。これは現在でも有効な手法でしょうか?

結論から申し上げますと、-z muldefs (または --allow-multiple-definition)は、現在でも GCC(正確にはGNUリンカ ld)のオプションとして有効であり、機能します。
しかし、現代のソフトウェア開発においては、これを常用することは「非常に非推奨な、避けるべき禁じ手(最終手段)」とされています。
その理由と、現在推奨されている正しい対処法を解説します。

1. 現在でも有効だが「非推奨」とされる理由
このオプションは、重複した定義のうち「最初に見つかったもの」を優先し、残りを無視して無理やりリンクを通すものです。
これが危険とされるのには、現代のコンパイラ最適化の進化が絡んでいます。

未定義動作(Undefined Behavior)の誘発
C/C++の標準規格(One Definition Rule / 単一定義規則)では、外部結合を持つ関数や変数の重複定義は認められていません。
これに違反すると「未定義動作」となり、プログラムがクラッシュしたり、予期せぬ計算結果を出力したりする原因になります。

コンパイラ最適化(LTOなど)との相性が最悪
現代の GCC で -Flto(リンク時最適化)などを有効にしている場合、リンカが「どの関数をインライン展開すべきか」を判断できなくなり、
コンパイルエラーになるか、あるいはバイナリが完全に破壊されるリスクがあります。

グローバル変数に対する挙動の変化(GCC 10以降)
C言語でヘッダに変数の実体を書いてしまう「暫定定義(Tentative Definition)」の重複は、昔の GCC ではデフォルトで許容されていました(-fcommon)。
しかし、GCC 10以降は安全性のためにデフォルトが -fno-common となり、厳格にエラーを出すようになっています。
これに引きずられて関数の重複もより厳しくチェックされるようになっています
516
(1): 06/05(金)22:39:47.44 ID:8HzJ+0tj(2/2) AAS
linux は馬鹿まじめに規格どおり実装してる部分とかあるので省電力とかが効きすぎて電力削減してバッテリ保たせるためにわざと速度落としてたりするぞ
省電力無効にしたり bluetooth を off たりしないと速度でないデバイスもある
523: 06/06(土)10:04:07.44 ID:82LXxxi3(2/2) AAS
wifiパワーセーブを1にしたけど変化なしだった
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.023s