|
|
|
помогите с линковкой
|
|||
|---|---|---|---|
|
#18+
Привет всем. Не могу разобраться почему не находит ссылки на методы классов. Короче по порядку: 1. проект собирается make файлом под линуксом. Также есть make.specific в котором я опрделяю пути к библиотекам + имена библиотек. 2. есть файлы (к примеру) c1.cpp и c1.h, в которых определен статический метод ALLNI::ALLNIScope::getALLNIScope(int). 3. из этих файлов я делаю стат библиотеку libc1.a 4. в make.specific проекта прописываю путь до этой библиотеки, и она её НАХОДИТ! 5. есть файл в с2.cpp в котором я вызываю метод ALLNI::ALLNIScope::getALLNIScope(int). И на этапе линковки получаю: с2.cpp:36: undefined reference to ALLNI::ALLNIScope::getALLNIScope(int) Библиотеку она видет т.к. ошибки о том что библ не найдена нет. В тоже время если я задаю в make.specific имя не существующей библиотеки она тут же ругается. Выкладываю файлы make и make.specific. Может быть попожет. make.specific Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. make : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. Два дня уже мучаюсь. подскажите плиз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2006, 19:21 |
|
||
|
помогите с линковкой
|
|||
|---|---|---|---|
|
#18+
Мэйк файлы не смотрел, долго разбираться, т.к. не указано, где происходит ошибка. Посоветую 2 правила: 1. При линковке надежней будет сначала указывать объектники, а потом либы. 2. Либы надо перечеслять, начиная с "тяжелых". Т.е., если либа 1 юзает либу 2, то сначала надо добавлять либу 1, а потом 2. Иначе линковщик подумает, что 2-я либа, как бы и не нужна и забьет на нее. А когда опомниться, уже будет поздно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2006, 09:56 |
|
||
|
помогите с линковкой
|
|||
|---|---|---|---|
|
#18+
Akh2. Либы надо перечеслять, начиная с "тяжелых". Т.е., если либа 1 юзает либу 2, то сначала надо добавлять либу 1, а потом 2. Иначе линковщик подумает, что 2-я либа, как бы и не нужна и забьет на нее. А когда опомниться, уже будет поздно. Это ваши домыслы или опыт на конкретном линкере ??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2006, 10:57 |
|
||
|
помогите с линковкой
|
|||
|---|---|---|---|
|
#18+
Gluk (Kazan) Akh2. Либы надо перечеслять, начиная с "тяжелых". Т.е., если либа 1 юзает либу 2, то сначала надо добавлять либу 1, а потом 2. Иначе линковщик подумает, что 2-я либа, как бы и не нужна и забьет на нее. А когда опомниться, уже будет поздно. Это ваши домыслы или опыт на конкретном линкере ??? Что вас смутило? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2006, 11:05 |
|
||
|
помогите с линковкой
|
|||
|---|---|---|---|
|
#18+
Отсутствие упоминания инструмента и его версии, в присутствии которого ваше заявление смахивает на правило от тумбочки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2006, 11:19 |
|
||
|
помогите с линковкой
|
|||
|---|---|---|---|
|
#18+
На опыте. Данное правило, не помешает для всех линковщиков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2006, 11:29 |
|
||
|
помогите с линковкой
|
|||
|---|---|---|---|
|
#18+
Проверил - порядок подключекния в данном ничего не меняет. Похоже что она библиотеки находит а функции в них - нет. Т.к. если я вообще не указываю библиотеки, то ошибка та же самая. Хм. Мои библиотеки libALLNIChannel.a и libALLNIScope.a . Конкретно функция ALLNI::ALLNIScope::getALLNIScope(int) содержиться в libALLNIScope.a. Собирал я их (библиотеки) через "ar rc ..." и потом на всякий случай "ranlib ...". Чё ж она не видит функции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2006, 12:17 |
|
||
|
помогите с линковкой
|
|||
|---|---|---|---|
|
#18+
Может он берет откуда-нибудь старую версию библиотеки (может в других директориях валяется)? Видит ли он вообще что-нибудь из нее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2006, 12:32 |
|
||
|
помогите с линковкой
|
|||
|---|---|---|---|
|
#18+
Я не знаю в чем у тебя дело, но у меня был подобный глюк если есть 2 библиотеки lib1.a и lib2.a, программа использует функции из обеих библиотек, и одна библиотека(lib1.a) использует функции из другой(lib2.a) то функции из (lib2.a) не видны в программе. Чтобы это исправить надо указать в коммандной строке библиотеку lib2.a 2 раза: перед lib1.a и после lib1.a -llib2 -llib1 llib2 Возможно у тебя эта же проблема ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2006, 12:49 |
|
||
|
помогите с линковкой
|
|||
|---|---|---|---|
|
#18+
да не. файл в единственном экземпляре. кроме того не вимдит ни одной функции из библ. при компилировании пишет : ........ -lALLNIChannelServer.ppc4 -lFesaPersistency -lFesaIntf -lcmwfesa -lFesaMW /ps/local/ppc4/lib/librda.a /ps/local/ppc4/lib/libOBEServer.a /ps/local/ppc4/lib/libJTC.a -lALLNIChannelRT.ppc4 -lFesaRT -lFesaRecorder /ps/local/ppc4/lib/librda.a -lALLNIScope -lALLNIChannel -lALLNIChannelGeneratedPart.ppc4 -lALLNIChannelCommon.ppc4 -lFesaXMLParser -lFesaSorting -lFesaLogging -lFesaSync -lFesaDataStore -lFesa -lALLNIScope -lALLNIScope -lFesaLib.ppc4 -lALLNIChannelRT.ppc4 -lFesaRT -lFesaRecorder /ps/local/ppc4/lib/librda.a -lALLNIScope -lALLNIChannel -lALLNIChannelServer.ppc4 -lFesaPersistency -lFesaIntf -lcmwfesa ........ значит млин видит и при сборке учитывает! При просмотре через F3 в mc вижу что есть такая функция. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2006, 12:52 |
|
||
|
помогите с линковкой
|
|||
|---|---|---|---|
|
#18+
и вообще если библиотеки используюут друг друга то надо внимательно просмотреть порядок их записи в коммандной строке ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2006, 12:53 |
|
||
|
помогите с линковкой
|
|||
|---|---|---|---|
|
#18+
Sandro_KЯ не знаю в чем у тебя дело, но у меня был подобный глюк если есть 2 библиотеки lib1.a и lib2.a, программа использует функции из обеих библиотек, и одна библиотека(lib1.a) использует функции из другой(lib2.a) то функции из (lib2.a) не видны в программе. Чтобы это исправить надо указать в коммандной строке библиотеку lib2.a 2 раза: перед lib1.a и после lib1.a -llib2 -llib1 llib2 Возможно у тебя эта же проблема В принципе, в твоем случае достаточно было указать -llib1 -llib2. При разборках с либой 1, линковщик запоминает, что не может связать. Потом ему дают вторую, где он находит нужные функции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2006, 13:00 |
|
||
|
помогите с линковкой
|
|||
|---|---|---|---|
|
#18+
http://www.sbor.net/linux-doc/lib/prog/gcc27/gcc1-2.html#ss2.9 авторЕсть различие в том, где в комадной строке вы записываете эту опцию; линкер ищет обрабатываемые библиотеки и объектные файлы в порядке, в котором они указаны. Таким образом, `foo.o -lz bar.o' ищет библиотеку `z' после файла `foo.o', но перед `bar.o'. Если `bar.o' ссылается на функции в `z', эти функции не могут быть загружены. А не наоборот? Я думал если foo.o ссылается на z тогда ошибка... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2006, 13:39 |
|
||
|
помогите с линковкой
|
|||
|---|---|---|---|
|
#18+
Именно. Я про это уже сказал в самом начале. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2006, 13:42 |
|
||
|
помогите с линковкой
|
|||
|---|---|---|---|
|
#18+
Akh Sandro_KЯ не знаю в чем у тебя дело, но у меня был подобный глюк если есть 2 библиотеки lib1.a и lib2.a, программа использует функции из обеих библиотек, и одна библиотека(lib1.a) использует функции из другой(lib2.a) то функции из (lib2.a) не видны в программе. Чтобы это исправить надо указать в коммандной строке библиотеку lib2.a 2 раза: перед lib1.a и после lib1.a -llib2 -llib1 llib2 Возможно у тебя эта же проблема В принципе, в твоем случае достаточно было указать -llib1 -llib2. При разборках с либой 1, линковщик запоминает, что не может связать. Потом ему дают вторую, где он находит нужные функции. Тут возможно я действительно неправильно написал, я точно не помню там библиотек было много и некоторые приходилось вписывать по 2 раза потому что иначе линкер не видел некоторые функции, в каком бы порядке библиотеки не были вписаны ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2006, 15:09 |
|
||
|
помогите с линковкой
|
|||
|---|---|---|---|
|
#18+
Sandro_KТут возможно я действительно неправильно написал, я точно не помню там библиотек было много и некоторые приходилось вписывать по 2 раза потому что иначе линкер не видел некоторые функции, в каком бы порядке библиотеки не были вписаны Вполне возможна такая ситуация. Если либы будут пользовать друг друга, например. :) Но я с такой ни разу сталкивался. По моему это изврат. ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2006, 15:18 |
|
||
|
помогите с линковкой
|
|||
|---|---|---|---|
|
#18+
Akh Sandro_KТут возможно я действительно неправильно написал, я точно не помню там библиотек было много и некоторые приходилось вписывать по 2 раза потому что иначе линкер не видел некоторые функции, в каком бы порядке библиотеки не были вписаны Вполне возможна такая ситуация. Если либы будут пользовать друг друга, например. :) Но я с такой ни разу сталкивался. По моему это изврат. ;) Я тоже считаю это извратом, но я помню что 2 дня возился с этим ничего понять не мог, пока знакомый мне не сказал чтоб я некоторые библиотеки включил 2 раза, после этого все откомпилилось, потом я еще долго пытался понять почему, толком так и не разобрался, но помоему если несколько библиотек используют функции из какой-то библиотеки то ее приходится вписывать 2 раза (возможно тут еще играет роль степень вложенности). Там было больше 20 библиотек с достаточно сложными зависимостями, но такого чтоб 2 библиотеки использовали друг друга там точно не было. Может кто-нибудь знает про это подробно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2006, 15:39 |
|
||
|
помогите с линковкой
|
|||
|---|---|---|---|
|
#18+
Sandro_KЯ тоже считаю это извратом, но я помню что 2 дня возился с этим ничего понять не мог, пока знакомый мне не сказал чтоб я некоторые библиотеки включил 2 раза, после этого все откомпилилось, потом я еще долго пытался понять почему, толком так и не разобрался, но помоему если несколько библиотек используют функции из какой-то библиотеки то ее приходится вписывать 2 раза (возможно тут еще играет роль степень вложенности). Там было больше 20 библиотек с достаточно сложными зависимостями, но такого чтоб 2 библиотеки использовали друг друга там точно не было. Может кто-нибудь знает про это подробно? Я считаю, что надо подключать библиотеку только тогда, когда закончаться файлы, которые ее юзают. По всей видимости, линкер, когда до нее доходит, он смотрит, есть ли в ней что-нибудь полезное. Забирает то что надо и забывает про нее. Суть включения 2 раза: первый раз он забирает, то что надо из нее, второй раз он забирает из нее, новые ссылки, появившиеся после просмотра других файлов, появившися после просмотра первого включения библиотеки. Ну, и конечно первое включение - получение имен, которые требуются самой библиотеки из других. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2006, 16:28 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=342&tid=2030797]: |
0ms |
get settings: |
9ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
41ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
| others: | 225ms |
| total: | 376ms |

| 0 / 0 |
