Ошибка undefined reference to loop: Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹

ΠŸΡ€ΠΈ компиляции ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Π½Π° языкС Π‘ΠΈ ΠΈΠ»ΠΈ C++ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ часто ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°ΡŽΡ‚ΡΡ с Π·Π°Π³Π°Π΄ΠΎΡ‡Π½Ρ‹ΠΌΠΈ сообщСниями ΠΎΡ‚ Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² Ρ‚ΡƒΠΏΠΈΠΊ Π΄Π°ΠΆΠ΅ ΠΎΠΏΡ‹Ρ‚Π½ΠΎΠ³ΠΎ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Π°. Одним ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространСнных ΠΈ ΠΏΡƒΠ³Π°ΡŽΡ‰ΠΈΡ… Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ² являСтся ошибка undefined reference to loop, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰Π°Ρ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΊΠΎΠ³Π΄Π° компилятор Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΉΡ‚ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ для Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Π­Ρ‚Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π½Π΅ связана с синтаксисом ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ провСряСтся Π½Π° Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½ΠΈΡ… этапах, Π° ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π² ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ процСсса сборки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈΠ»ΠΈ Π»ΠΎΠ³ΠΈΠΊΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ. ПониманиС ΠΏΡ€ΠΈΡ€ΠΎΠ΄Ρ‹ этой ошибки критичСски Π²Π°ΠΆΠ½ΠΎ для эффСктивной ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ» Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠΈ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ нСвозмоТности создания исполняСмого Ρ„Π°ΠΉΠ»Π°.

Π‘ΡƒΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ кроСтся Π² Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ компиляциСй ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΈ ΠΈΡ… ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ объСдинСниСм Π² Π΅Π΄ΠΈΠ½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. Когда Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅ сообщСниС ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ссылка Π½Π° loop Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°, это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ компилятор Π²ΠΈΠ΄Π΅Π» объявлСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½ΠΎ ΠΏΡ€ΠΈ сборкС Ρ„ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊΠ° Π½Π΅ нашСл Π΅Ρ‘ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠ»ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ синтаксичСских ошибок, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, данная ошибка появляСтся Π½Π° этапС Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹-ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΠ° ld (linker), Ρ‡Ρ‚ΠΎ часто сбиваСт с Ρ‚ΠΎΠ»ΠΊΡƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΏΡ€ΠΈΠ²Ρ‹ΠΊΡˆΠΈΡ… Π²ΠΈΠ΄Π΅Ρ‚ΡŒ ошибки нСпосрСдствСнно Π² Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅ ΠΊΠΎΠ΄Π°.

⚠️ Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Ошибка undefined reference всСгда Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π½Π° этапС Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠΈ, Π° Π½Π΅ компиляции. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ исходный ΠΊΠΎΠ΄ синтаксичСски ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π΅Π½, Π½ΠΎ Π½Π°Ρ€ΡƒΡˆΠ΅Π½Π° Ρ†Π΅Π»ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ сборки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

Для ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ устранСния Π½Π΅ΠΏΠΎΠ»Π°Π΄ΠΊΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ‡Π΅Ρ‚ΠΊΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ сСбС процСсс трансляции ΠΊΠΎΠ΄Π°. Π‘Π½Π°Ρ‡Π°Π»Π° компилятор ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ, создавая ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ .o ΠΈΠ»ΠΈ .obj. На этом этапС компилятору достаточно Π·Π½Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΡ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ². Однако ΠΈΠΌΠ΅Π½Π½ΠΎ Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΌ этапС, ΠΊΠΎΠ³Π΄Π° Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊ пытаСтся ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ всС эти кусочки Π²ΠΎΠ΅Π΄ΠΈΠ½ΠΎ, выясняСтся, Ρ‡Ρ‚ΠΎ Ρ‚Π΅Π»ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ loop Π½ΠΈΠ³Π΄Π΅ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΈ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ Ρ„Π°Ρ‚Π°Π»ΡŒΠ½ΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ сборки.

Анализ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ возникновСния ошибки Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠΈ

ΠŸΠ΅Ρ€Π²ΠΎΠΉ ΠΈ самой ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎΠΉ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ появлСния сообщСния ΠΎΠ± отсутствии ссылки являСтся банальноС отсутствиС Ρ„Π°ΠΉΠ»Π° с Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅. Часто Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π·Π°Π±Ρ‹Π²Π°ΡŽΡ‚ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ исходный Ρ„Π°ΠΉΠ», содСрТащий Ρ‚Π΅Π»ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ loop, Π² список Ρ„Π°ΠΉΠ»ΠΎΠ² для компиляции Π² IDE ΠΈΠ»ΠΈ makefile. Π’ Ρ‚Π°ΠΊΠΈΡ… ситуациях компилятор просто ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Π°ΠΉΠ», считая, Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ рСализация Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΉΠ΄Π΅Π½Π° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ мСстС, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² систСмных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ…, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ошибкС Π½Π° Ρ„ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΌ этапС.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ распространСнной ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ являСтся нСсоотвСтствиС ΠΈΠΌΠ΅Π½ ΠΈΠ»ΠΈ сигнатур Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π’ языкС C++ ΠΈΠΌΠ΅Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΠΎΠ΄Π²Π΅Ρ€Π³Π°ΡŽΡ‚ΡΡ "name mangling", Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ измСнСнию для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠΈ, поэтому Π΄Π°ΠΆΠ΅ Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ Π² Ρ‚ΠΈΠΏΠ°Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈΠ»ΠΈ отсутствии спСцификатора extern "C" ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊ Π½Π΅ смоТСт ΡΠ²ΡΠ·Π°Ρ‚ΡŒ Π²Ρ‹Π·ΠΎΠ² с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, частой ошибкой являСтся ΠΎΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΠ° Π² ΠΈΠΌΠ΅Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: Ссли Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ функция объявлСна ΠΊΠ°ΠΊ void loop(), Π° Π² ΠΊΠΎΠ΄Π΅ вызываСтся ΠΊΠ°ΠΊ void Loop(), Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π½ΠΎ Loop ΠΈ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Ρ‚ Π΅Ρ‘.

  • πŸ” ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΈΠ΅ исходного Ρ„Π°ΠΉΠ»Π° с Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² спискС компиляции ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.
  • πŸ” НСсоотвСтствиС сигнатур Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ (Ρ€Π°Π·Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²).
  • πŸ” ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с "name mangling" Π² C++ ΠΏΡ€ΠΈ смСшивании ΠΊΠΎΠ΄Π° Π½Π° C ΠΈ C++.
  • πŸ” ΠžΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΠΈ Π² названиях Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΊ рСгистру символов.

Π’Π°ΠΊΠΆΠ΅ стоит ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости символов. Если функция ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Π° ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом static Π² Ρ„Π°ΠΉΠ»Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΎΠ½Π° становится Π²ΠΈΠ΄ΠΈΠΌΠΎΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ этого Ρ„Π°ΠΉΠ»Π° ΠΈ нСдоступна для Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊΠ° ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ. Π­Ρ‚ΠΎ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для инкапсуляции, Π½ΠΎ Ссли Π²Ρ‹ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ·Π²Π½Π΅, спСцификатор static Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ. Аналогичная ситуация Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, Ссли функция объявлСна Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° ΠΊΠΎΠ΄Π° ΠΈΠ»ΠΈ класса Π±Π΅Π· ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ экспорта.

ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΡ€ΠΈ компиляции

Одной ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠ²Π°Ρ€Π½Ρ‹Ρ… ΠΏΡ€ΠΈΡ‡ΠΈΠ½ ошибки undefined reference являСтся Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ порядок слСдования Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС компилятора. Π›ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ GNU ld, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π² ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΡ…ΠΎΠ΄: ΠΎΠ½ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ Ρ„Π°ΠΉΠ»Ρ‹ слСва Π½Π°ΠΏΡ€Π°Π²ΠΎ ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ символов Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ для Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ссылок Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚. Если Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΡƒΠΊΠ°Π·Π°Π½Π° ΠΏΠ΅Ρ€Π΅Π΄ Ρ„Π°ΠΉΠ»ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΅Ρ‘ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚, Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π΅Ρ‘ содСрТимоС, посчитав, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π½Π΅ Π½ΡƒΠΆΠ½Π°.

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ, Π³Π΄Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° libm.a стоит ΠΏΠ΅Ρ€Π΅Π΄ основным Ρ„Π°ΠΉΠ»ΠΎΠΌ main.c. Π’ этом случаС Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊ сначала просматриваСт Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ, Π½Π΅ Π²ΠΈΠ΄ΠΈΡ‚ unresolved references (Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ main Π΅Ρ‰Π΅ Π½Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½) ΠΈ отбрасываСт Π΅Ρ‘. Когда ΠΆΠ΅ Π΄ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π΄ΠΎ main.c, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎΡΡ‚ΡŒ Π² функциях ΠΈΠ· ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠΈ, Π½ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΡƒΠΆΠ΅ "Π·Π°Π±Ρ‹Ρ‚Π°". ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠΌ являСтся Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, послС всСх ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² Π½ΠΈΡ… Π½ΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ.

πŸ“Š Π’ ΠΊΠ°ΠΊΠΎΠΌ порядкС Π²Ρ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΡ€ΠΈ компиляции?
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΏΠ΅Ρ€Π΅Π΄ исходниками
Π˜ΡΡ…ΠΎΠ΄Π½ΠΈΠΊΠΈ ΠΏΠ΅Ρ€Π΅Π΄ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ
Π’ случайном порядкС
Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ IDE

Для ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ сборки Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ±Π»ΡŽΠ΄Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ: зависимыС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠ΄Ρ‚ΠΈ ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΌΠΈ символы. Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ статичСскиС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, порядок становится критичСски Π²Π°ΠΆΠ½Ρ‹ΠΌ. ДинамичСскиС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ (.so ΠΈΠ»ΠΈ .dll) ΠΌΠ΅Π½Π΅Π΅ Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ ΠΊ порядку, Π½ΠΎ ΠΈ ΠΈΡ… рСкомСндуСтся ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π² ΠΊΠΎΠ½Ρ†Π΅. ΠΠ°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ этого ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° β€” классичСская ошибка, которая ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΡΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΡŽ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ссылка Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°, Π΄Π°ΠΆΠ΅ Ссли всС Ρ„Π°ΠΉΠ»Ρ‹ физичСски ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅.

⚠️ Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΠŸΡ€ΠΈ использовании GCC ΠΈΠ»ΠΈ Clang всСгда ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΠΉΡ‚Π΅ Ρ„Π»Π°Π³ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, -lm) Π² самом ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, послС всСх .o Ρ„Π°ΠΉΠ»ΠΎΠ².

Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки. Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ случаС Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊ Π½Π΅ смоТСт Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ символы ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠΈ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½Π° ΡƒΠΊΠ°Π·Π°Π½Π° слишком Ρ€Π°Π½ΠΎ. Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ случаС порядок ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π΅Π½: сначала ΠΈΠ΄ΡƒΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, содСрТащиС Π²Ρ‹Π·ΠΎΠ²Ρ‹, ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°Ρ‚Π΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, содСрТащиС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ этих Π²Ρ‹Π·ΠΎΠ²ΠΎΠ².

# ΠΠ΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ: Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠΌ

gcc -lm main.o -o program

ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ: ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» ΠΏΠ΅Ρ€Π΅Π΄ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ

gcc main.o -lm -o program

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ со статичСскими Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ ΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΌΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ

Π Π°Π±ΠΎΡ‚Π° со статичСскими Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ (.a Π² Linux, .lib Π² Windows) Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ особого внимания, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ частой ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ ошибок Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠΈ. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ динамичСских Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, ΠΊΠΎΠ΄ ΠΈΠ· статичСской Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ копируСтся Π² исполняСмый Ρ„Π°ΠΉΠ» ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π½Π° этапС сборки. Если Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊ Π½Π΅ Π²ΠΈΠ΄ΠΈΡ‚ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Π½ΡƒΠΆΠ½Ρ‹ΠΉ символ, ΠΎΠ½ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ°Ρ‚ΡŒ Π΅Π³ΠΎ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… мСстах, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ это Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ΠΎ явно, ΠΈ выдаст ΠΎΡˆΠΈΠ±ΠΊΡƒ undefined reference.

Часто ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» (.h) ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½, ΠΈ компилятор Π²ΠΈΠ΄ΠΈΡ‚ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½ΠΎ сама Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π½Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Π° ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊΠΎΠΌ. Π­Ρ‚ΠΎ создаСт иллюзию работоспособности ΠΊΠΎΠ΄Π° Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ сборки. Π’Π°ΠΆΠ½ΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΏΡƒΡ‚ΡŒ ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ ΡƒΠΊΠ°Π·Π°Π½ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Ρ‡Π΅Ρ€Π΅Π· Ρ„Π»Π°Π³ -L, Π° имя Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Ρ‡Π΅Ρ€Π΅Π· Ρ„Π»Π°Π³ -l (Π±Π΅Π· прСфикса lib ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ). НапримСр, для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ libfoo.a Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π»Π°Π³ -lfoo.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ статичСскиС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ ΠΊ порядку?

БтатичСскиС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊΠΎΠΌ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎ. Если символ Π½Π΅ Π½ΡƒΠΆΠ΅Π½ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΎΠ½ игнорируСтся. ДинамичСскиС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ΡΡ Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠΎΠΌ ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ символы ΠΏΠΎΠ·ΠΆΠ΅, Π½ΠΎ статичСскиС Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ строгого порядка "использованиС -> ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅".

Π•Ρ‰Π΅ ΠΎΠ΄Π½ΠΈΠΌ нюансом являСтся Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²ΠΊΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ. Если Π΄Π²Π΅ статичСскиС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ зависят Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π° (цикличСская Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ), простого указания ΠΈΡ… Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ порядкС ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСдостаточно. Π’ Ρ‚Π°ΠΊΠΈΡ… случаях приходится ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π΄Π²Π°ΠΆΠ΄Ρ‹ ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„Π»Π°Π»Ρ‹ Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊΠ°, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ --start-group ΠΈ --end-group, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊ ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΈΡ… нСсколько Ρ€Π°Π· Π΄ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ всСх ссылок.

Π’ΠΈΠΏ Ρ„Π°ΠΉΠ»Π° Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ (Linux) Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ (Windows) ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠΈ
ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» .o .obj Π’Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ совпадСния ΠΈΠΌΠ΅Π½ символов
БтатичСская Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° .a .lib Π§ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Π° ΠΊ порядку Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²
ДинамичСская Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° .so .dll Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ символов ΠΏΡ€ΠΈ запускС ΠΈΠ»ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅
Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» .h .h НС участвуСт Π² Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠ΅, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² компиляции

Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹ с C++ ΠΈ name mangling

ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π΅ с языка Π‘ΠΈ Π½Π° C++ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ часто ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°ΡŽΡ‚ΡΡ с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ компилировался Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, пСрСстаСт Π»ΠΈΠ½ΠΊΠΎΠ²Π°Ρ‚ΡŒΡΡ. Π­Ρ‚ΠΎ связано с ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠΌ name mangling, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ компилятор C++ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ loop(int) ΠΈ loop(double) Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΎ Π² ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, _Z4loopi ΠΈ _Z4loopd. Если Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊ ΠΈΡ‰Π΅Ρ‚ ΠΎΠ΄Π½ΠΎ имя, Π° Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ записано Π΄Ρ€ΡƒΠ³ΠΎΠ΅, Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ ошибка.

ОсобСнно часто это проявляСтся ΠΏΡ€ΠΈ смСшивании ΠΊΠΎΠ΄Π° Π½Π° C ΠΈ C++. Если Π²Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈΠ· C-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π² C++ ΠΊΠΎΠ΄Π΅, компилятор C++ попытаСтся "ΠΈΡΠΏΠΎΡ€Ρ‚ΠΈΡ‚ΡŒ" имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, оТидая C++ Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠΈ, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ имя ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ. Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ конструкция extern "C", которая Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅Ρ‚ компилятору ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, оставляя Π΅Π³ΠΎ Ρ‚Π°ΠΊΠΈΠΌ, ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π² исходном C-ΠΊΠΎΠ΄Π΅.

β˜‘οΈ ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° C++ совмСстимости

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ: 0 / 4

Π’Π°ΠΊΠΆΠ΅ стоит ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° пространства ΠΈΠΌΠ΅Π½ (namespace). Если функция объявлСна Π²Π½ΡƒΡ‚Ρ€ΠΈ пространства ΠΈΠΌΠ΅Π½, Π΅Ρ‘ ΠΏΠΎΠ»Π½ΠΎΠ΅ имя Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ прСфикс этого пространства. Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Π΅Π· указания пространства ΠΈΠΌΠ΅Π½ ΠΈΠ»ΠΈ с использованиСм Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ using-Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ компилятор Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² глобальной области видимости, Π½Π΅ найдя Π΅Ρ‘ Ρ‚Π°ΠΌ.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ классы Π² C++ ΠΈΠΌΠ΅ΡŽΡ‚ свои особСнности. Код ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π²ΠΈΠ΄Π΅Π½ компилятору Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ инстанцирования, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅. Если рСализация шаблонной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ вынСсСна Π² .cpp Ρ„Π°ΠΉΠ», Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Π½Π°ΠΉΡ‚ΠΈ Π΅Ρ‘, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ конкрСтная вСрсия шаблона для Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π½Π΅ Π±Ρ‹Π»Π° сгСнСрирована.

ИспользованиС ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Ρ… Ρ„Π»Π°Π³ΠΎΠ² компилятора ΠΈ Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊΠ°

Для ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ сборки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° нСдостаточно просто Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ инструмСнт сборки. Π€Π»Π°Π³ΠΈ компилятора дСлятся Π½Π° Π΄Π²Π΅ Π³Ρ€ΡƒΠΏΠΏΡ‹: Ρ‚Π΅, Ρ‡Ρ‚ΠΎ Π²Π»ΠΈΡΡŽΡ‚ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ (-I для ΠΏΡƒΡ‚Π΅ΠΉ ΠΊ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°ΠΌ, -D для макросов), ΠΈ Ρ‚Π΅, Ρ‡Ρ‚ΠΎ Π²Π»ΠΈΡΡŽΡ‚ Π½Π° Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΡƒ (-L для ΠΏΡƒΡ‚Π΅ΠΉ ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌ, -l для ΠΈΠΌΠ΅Π½ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ). Ошибка undefined reference часто Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ missing Ρ„Π»Π°Π³Π° -L, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ, Π³Π΄Π΅ ΠΈΡΠΊΠ°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.

Π’Π°ΠΆΠ½ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π°Ρ‚ΡŒ Ρ„Π»Π°Π³ΠΈ для компилятора (gcc, g++) ΠΈ нСпосрСдствСнно для Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊΠ°. Π₯отя gcc часто Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊ автоматичСски, пСрСдавая Π΅ΠΌΡƒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ спСцифичСскиС ΠΎΠΏΡ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΈΠ»ΠΈ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹, Ссли ΠΎΠ½ΠΈ стоят Π½Π΅ Π½Π° своСм мСстС. НапримСр, Ρ„Π»Π°Π³ -Wl, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΎΠΏΡ†ΠΈΠΉ нСпосрСдствСнно Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊΡƒ, минуя ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΡŽ компилятором.

ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с слоТными ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌΠΈ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ„Π°ΠΉΠ»Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ CMakeLists.txt ΠΈΠ»ΠΈ Makefile. Ошибка Π² этих Ρ„Π°ΠΉΠ»Π°Ρ…, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ зависимостСй Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Ρ‚Π΅ΠΌ ΠΆΠ΅ симптомам. Π’ CMake, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ явно ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ связь ΠΌΠ΅ΠΆΠ΄Ρƒ исполняСмым Ρ„Π°ΠΉΠ»ΠΎΠΌ ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ target_link_libraries.

Диагностика ΠΈ инструмСнты ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠΈ

Для выявлСния ΠΏΡ€ΠΈΡ‡ΠΈΠ½ ошибки undefined reference to loop ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ спСциализированныС инструмСнты Π°Π½Π°Π»ΠΈΠ·Π° Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ². Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° nm позволяСт ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ символов Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ… ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ…. Π‘ Π΅Ρ‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΡ‡Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, экспортируСтся Π»ΠΈ нуТная функция ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠ½Π° называСтся. Π€Π»Π°Π³ -C ΠΏΡ€ΠΈ использовании с nm позволяСт Π΄Π΅ΠΌΠ°Π½Π³Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π° C++ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, дСлая ΠΈΡ… Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΌΠΈ.

Π•Ρ‰Π΅ ΠΎΠ΄Π½ΠΈΠΌ ΠΌΠΎΡ‰Π½Ρ‹ΠΌ инструмСнтом являСтся objdump, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдоставляСт Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ структурС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ². Π‘ Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ символы Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ Ρ„Π°ΠΉΠ»Ρƒ (undefined symbols) ΠΈ ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ. Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ списков Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Ρ… ΠΈ прСдоставляСмых символов часто сразу ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Π½Π΅Π΄ΠΎΡΡ‚Π°ΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΈΠ»ΠΈ нСсовпадСниС ΠΈΠΌΠ΅Π½.

⚠️ Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡ‹ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки ΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ инструмСнтов ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ Π² Ρ€Π°Π·Π½Ρ‹Ρ… вСрсиях компиляторов ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСмах. ВсСгда ΡΠ²Π΅Ρ€ΡΠΉΡ‚Π΅ΡΡŒ с Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ (man pages) для вашСй ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ срСды Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

Π’Π°ΠΊΠΆΠ΅ стоит ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ verbose Ρ€Π΅ΠΆΠΈΠΌ компиляции. Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ„Π»Π°Π³Π° -v ΠΊ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ компилятора Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΉ Π»ΠΎΠ³ всСх дСйствий, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊΠ°. Π­Ρ‚ΠΎ позволяСт ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ порядок Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… Π½Π° Π²Ρ…ΠΎΠ΄ Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊΡƒ, Ρ‡Ρ‚ΠΎ часто ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π½Π°ΠΉΡ‚ΠΈ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π² скриптС сборки, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π΅ Π²ΠΈΠ΄Π½ΠΎ Π² исходном Makefile.

Часто Π·Π°Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ вопросы (FAQ)

ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ошибка undefined reference, Ссли Ρ„Π°ΠΉΠ» с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½?

Π”Π°ΠΆΠ΅ Ссли Ρ„Π°ΠΉΠ» ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½, ошибка ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Ρ‚ΡŒ ΠΈΠ·-Π·Π° Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ порядка Ρ„Π°ΠΉΠ»ΠΎΠ² Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС (Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌ Ρ„Π°ΠΉΠ»ΠΎΠΌ), нСсоотвСтствия сигнатур Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (Ρ€Π°Π·Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²), использования спСцификатора static ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с name mangling Π² C++.

Π’ Ρ‡Π΅ΠΌ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ error: undefined reference ΠΈ fatal error: .h file not found?

Ошибка "file not found" Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π½Π° этапС компиляции, ΠΊΠΎΠ³Π΄Π° компилятор Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΉΡ‚ΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» с объявлСниСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Ошибка "undefined reference" Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π½Π° этапС Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠΈ, ΠΊΠΎΠ³Π΄Π° компилятор Π²ΠΈΠ΄ΠΈΡ‚ объявлСниС, Π½ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΉΡ‚ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ (Ρ‚Π΅Π»ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ) Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ… ΠΈΠ»ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ….

Как ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΏΡ€ΠΈ использовании Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ C Π² ΠΊΠΎΠ΄Π΅ C++?

НСобходимо ΠΎΠ±Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² C Π² ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ extern "C" { #include <header.h> }. Π­Ρ‚ΠΎ Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ компилятору C++ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈΠΌΠ΅Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (name mangling), позволяя Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊΡƒ Π½Π°ΠΉΡ‚ΠΈ ΠΈΡ… Π² C-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ ΠΏΠΎ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π°ΠΌ.

ΠœΠΎΠΆΠ΅Ρ‚ Π»ΠΈ антивирус Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ undefined reference?

Π’ Ρ€Π΅Π΄ΠΊΠΈΡ… случаях антивирус ΠΌΠΎΠΆΠ΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ доступ компилятора ΠΊ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»Π°ΠΌ ΠΈΠ»ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ошибкам сборки. Однако Ρ‡Π°Ρ‰Π΅ всСго ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° кроСтся Π² настройках ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠ°ΠΏΠΊΡƒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π² ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ антивируса для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ.