2012-04-12 1 views
0

Здесь ошибка:Switched из общей библиотеки DLL, теперь получаю сообщение об ошибке, что он не может найти Pow()

symbol lookup error: ./src/libprog3.so: undefined symbol: pow 

Все остальное в библиотеке работает отлично, даже функции, которые используют math.h , но когда я вызываю функцию, которая нуждается в pow(), она сработает. Он работал отлично, когда это была общая библиотека. Я использую gcc и makefile для компиляции. Единственное изменение, которое я внес в make-файл, заключалось в добавлении -ldl для библиотеки. У меня все еще есть. Я изменил программу драйвера для поддержки изменения в dll вместо общей библиотеки, но функция, вызывающая ошибку, не изменилась.

Есть ли еще файл makefile, который мне нужно изменить? Вот Makefile:

testlib: src/driver.o src/prog3.o 
    gcc -fPIC -Wall -c src/prog3.c -o src/prog3.o 
    gcc -Wall -shared -o src/libprog3.so src/prog3.o 
    gcc -Wall -o [email protected] src/driver.c -ldl -lm -Lsrc -lprog3 
+0

Какая платформа? –

+0

Я использую xubuntu x64. – user1279914

+0

Все, что вы сделали, это добавить '-ldl' в последнюю строку в примерном фрагменте файла makefile? Итак, если вы удалите '-ldl', он снова работает? Я чувствую, что нам не хватает важной информации. –

ответ

3

Вы должны делать:

gcc -Wall -shared -o src/libprog3.so src/prog3.o -lm 

То есть, разделяемые библиотеки должны быть построены с их зависимостями. Если вы опустите -lm, вы сообщаете компоновщику, что неразрешенные символы в libprog3.so предназначены для разрешения символами в основной программе или библиотеками, которые она уже загружала. Я вижу, что вы поместили -lm в командную строку связи для основной программы, но я предполагаю, что основная программа фактически не использовала никаких символов от libm.so, и поэтому она не добавилась в таблицу DT_NEEDED для основной программы и, следовательно, не загружен.

В любом случае, делать зависимости, подобные этому, почти всегда лучше.

+0

Я действительно пробовал это раньше, и это не сработало, но я попробовал еще раз, и теперь это работает. Наверное, у меня было другое, что я исправил в пути. Прежде чем перестать думать, что это проблема, потому что она работала до того, как я сделал динамические ссылки. Спасибо! – user1279914