Есть вопрос!Fedora 14 - не линкуются функции из математической библиотеки

Люди. кто-нибудь сталкивался с такой вот проблемой: у меня была некая прикладная программа на C/C++, состоящая из нескольких файлов исходных текстов. На ASP Linux 12 Carbon (т.е. Fedora 7) всё собиралось и работало. На Russian Fedora Remix 14.1 работает, что было собрано на Fedora 7, но не собирается при попытке компиляции-линковки (gcc, g++). Компилируется нормально, но линковщик выдаёт неопределённую ссылку на функцию fabs(double). Аналогичная реакция возникает и на любую другую функцию из математической библиотеки. Добавление опции -lm в командную строку линковки ничего не даёт. Повторяю, что на Fedora 7, Red Hat Enterprise Linux 5.x всё линкуется без вопросов. Ещё вот что интересно — пишешь простую тестовую программку на C++ с вызовом fabs (или sin, или cos) внутри — линкуется на ура и без добавления -lm. Но там один .o -файл, а в той, которая не собирается — их несколько. Кто-нибудь сталкивался с этим? Подскажите, куда копать!

Комментарии (13)

А можно посмотреть на код? Может так станет понятнее.
Код-то весьма сложный и длинный, да и под рукой сейчас нету его. К тому же код проприетарный. Завтра попробую вычленить только то, что непосредственно влияет на проблему (а там в makefile несколько программ линкуются). Но тот факт, что на RedHat Enterprise Linux 5.x и на fedora 7 всё работает нормально, а тут — не работает, удручает. Хотел было поновее систему себе поставить, но из-за этой проблемы работать возможности нету, пришлось снести и вернуться назад на Fedora 7 (ASP Linux 12 Carbon), где проблемы не было. У заказчика на ASP Linux Server V тоже всё Ok. Вот такие вещи останавливают от использования новых версий Fedora — не знаешь, где получишь нож в спину
Возможно, просто не установлен какой-нибудь пакет.
Возможно. Но я все compat* поставил (ибо мне нужен был для работы старый Фортран g77 — т.е. нужен был compat-gcc-g77). Так что хотелось бы знать, какой. Установочный диск RFRemix 14, кстати, не содержал этой категории пакетов вообще, и пришлось качать их с репозитория в Интернете. В установочных дисках ASP Linux (12 = Fedora 7, 14 = Fedora 9), кстати, есть категория «разработка устаревших приложений», где эти все compat* можно выбирать. А в RFRemix 14 — нету. Это не есть хорошо. Какой-то пакет не установлен. А может, наоборот, какой-нибудь лишний установлен. Вот и хотелось бы узнать — какой?
В любом случае без логов и примера неработающего кода решить эту проблему невозможно. fabs нормально работает в Ф14, проверил.
Ну да, у меня тоже нормально работает в Ф 14, если я просто напишу одну программку test.cpp, где вызову fabs (кстати, та же история и с sin, cos и т.п.) и просто сделаю g++ test.cpp -o ttest. А если несколько объектников собирать? А у меня оттуда ещё вызываются сокеты, например. В общем, за конечное время эту проблему не решить, как я и предполагал. Потому и правильно откатился на старую Федору, где всё работало. Я не могу остановить все работы и искать причину такого странного поведения линковщика (ибо заказчику это не нужно, у него ASP Linux Server V, это мне нужно было чисто для моего удобства). Поэтому я поставлю RF 14 под VMWare в стороночку и попробую на досуге создать более простой пример, который бы не работал таким же образом — просто интересно выяснить, что же не нравится. О результатах сообщу.
С подобной ситуацией сталкивалась достаточно давно, около года назад, потому, к сожалению, всех подробностей не помню… Но ситуация была аналогичная, компилятор (gcc,intelский) посылал далеко и на долго именно на этих же функциях… могу точно сказать, что в моем случае была наведенка (косяки с памятью). Честно говоря, в таких вещах чудес не бывает, на мой взгляд, и данные функции, думаю, явно тут не при чем (хотя линуксы такие линуксы :))).
Вот поэтому-то «самые новые и крутые» Линуксы для реальной работы часто не годятся — вот из-за таких «чудес» — приходится откат давать на старые версии
Вот сравнивая мою систему ASP Linux 12 Carbon (дистр на основе Fedora 7) я заметил, что имеется /usr/lib/libm.a и libm.so:

s -la /usr/lib/libm.*
-rw-r--r-- 1 root root 514776 Июл 17 2007 /usr/lib/libm.a
lrwxrwxrwx 1 root root 19 Янв 28 2008 /usr/lib/libm.so -> ../../lib/libm.so.6

Та же команда в Russian Fedora Remix 14 даёт только динамическую версию libm, а статическую не даёт:
s -la /usr/lib/libm.*
-rw-r--r-- 1 root root 514776 Июл 17 2007 /usr/lib/libm.a
lrwxrwxrwx 1 root root 19 Янв 28 2008 /usr/lib/libm.so -> ../../lib/libm.so.6

Может, тут следует копать? Тогда вопрос: а где взять libm.a для Fedora 14? Т.е. какой rpm её содержать должен — кто-нибудь в курсе?

О! Решил эту проблему сам. Вот попробуйте такой код (tm.cpp):
#include <stdio.h>

double fabs(double);

int main (int argc, char **argv) {

float x=9.0;
printf(«fabs=%7.2f\n»,x);
}

Теперь g++ tm.cpp -o tm — отлуп:
tm.cpp:(.text+0x1a): undefined reference to `fabs(double)'

Когда убираем строчку double fabs(double); и пишем просто #include <math.h> — всё пролетает на ура. Надо в math.h заглянуть — видать, там какая-то хитрость. Хотя man fabs говорит, что double fabs(double); — это нормальное объявление.
В общем, у страха глаза велики :). Когда такое к концу дня возникает, не можешь сразу сообразить. Так что, похоже, с учётом вышеописанного всё будет работать нормально. Т.е. если честно включать math.h — всё хорошо, а если самому объявлять эти функции — всё плохо. Хотя раньше пролетало и то, и другое. Так что снова поставлю себе Russian Fedora Remix 14, уж больно нравится мне. Есть там недоделки с русификацией ряда программ (в ASP-е они обычно это доводили до ума), зато сразу опознался видеоадаптер, сразу заработала встроенная видеокамера и WiFi работает через nm-applet — солидно. К тому же, у меня образ диска уже остался, где стояли все нужные мне пакеты — считаю и время сэкономлю
Конечно же лучше следовать стандартам кодописания :)
Удачи с Федорой.
Понятно, но в ASP Linux 12 (Fedora 7) это проходило, а тут перестало. Также в другом приложении — при линковке выдалось сообщение, что sincos@@GLIBC_2.1.1 требуется, определено в libm.so.6 и дан совет включить эту библиотеку в командную строку линкера (надо же! Ещё и советы даёт, чего включить, а не просто неопределённые ссылки!). В Fedora 7 это приложение линковалось нормально. Ну тут я, воспользовавшись советом, просто -lm добавил в строку линковки — и тут заработало. В общем, вернул Russian Fedora Remix 14 и продолжаю его использовать. А насчёт стандартов кодописания — иногда можно включать <math.h>, а иногда не очень удаётся (если, например, объявить переменную тем же именем, что и функция из math.h). Но тут, видимо, в RF 14 в libm.so.6 функции сидят C-шные, а не C++-ные, а в math.h они все, видимо, объявлены как extern «C». Поэтому и не линкуется, если сам объявляешь. А в старой системе была ещё и libm.a, где могли и C++-ные версии сидеть. Хотя, т.к. я в math.h не заглядывал, не могу сказать, так это или нет
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.