2010-01-18 4 views
1

Я в тупике. Вот вывод ld.недостающих символов, которые должны быть там

/usr/lib/libvisual-0.6/actor/actor_avs_superscope.so: undefined reference to `visual_mem_free' 
/usr/lib/libvisual-0.6/actor/actor_avs_superscope.so: undefined reference to `visual_mem_malloc0' 

Вот макросы:

#define visual_mem_new0(struct_type, n_structs)   \ 
    ((struct_type *) visual_mem_malloc0 (((visual_size_t) sizeof (struct_type)) * ((visual_size_t) (n_structs)))) 

#define visual_mem_malloc(size)  \ 
    visual_mem_malloc_impl (size, __FILE__, __LINE__, __PRETTY_FUNCTION__) 

#define visual_mem_malloc0(size) \ 
    visual_mem_malloc0_impl (size, __FILE__, __LINE__, __PRETTY_FUNCTION__) 

#define visual_mem_realloc(ptr, size) \ 
    visual_mem_realloc_impl (ptr, size, __FILE__, __LINE__, __PRETTY_FUNCTION__) 

#define visual_mem_free(ptr)  \ 
    visual_mem_free_impl (ptr, __FILE__, __LINE__, __PRETTY_FUNCTION__) 

Теперь не складываются. Одна строка говорит, что отсутствует visual_mem_free, что является макросом. Другой говорит, что visual_mem_malloc0 отсутствует, но на самом деле вызов visual_mem_new0 кода, который предполагает, что он видит visual_mem_new0.

priv = visual_mem_new0 (SuperScopePrivate, 1); 

visual_mem_free (priv); 

Любые подсказки?

Редактировать: Bumping .. Может быть, некоторые свежие глаза могут помочь?

Редактировать: Кстати, во время компиляции и связывания я не получаю никаких предупреждений/ошибок.

Редактировать: Вот пара фрагментов из вывода препроцессора.

int lv_superscope_cleanup (VisPluginData *plugin) 
{ 
SuperScopePrivate *priv = visual_object_get_private ((((VisObject*) ((plugin))))); 

visual_mem_free_impl (priv, "actor_avs_superscope.c", 195, __PRETTY_FUNCTION__); 

return 0; 
} 

И:

priv = ((SuperScopePrivate *) visual_mem_malloc0_impl (((visual_size_t) sizeof (SuperScopePrivate)) * ((visual_size_t) (1)), "actor_avs_superscope.c", 152, __PRETTY_FUNCTION__)); 

Похоже, макросы расширяются. Я смущен. Ожидается расширение __PRETTY_FUNCTION__?

Интересно, что здесь выводятся строки.

$ strings .libs/actor_avs_superscope.so |grep malloc 
visual_mem_malloc0_impl 
visual_mem_malloc0 
malloc 

Крис: Я просто бегу ld /usr/lib/libvisual-0.6/actor/actor_avs_superscope.so.

А вот выход из нм:

$ nm actor_avs_superscope.o |grep malloc 
     U visual_mem_malloc0_impl 

$ nm actor_avs_superscope.o |grep free 
     U visual_mem_free_impl 
     U visual_palette_free_colors 
+0

Что такое команда ld, которая дает эти ошибки? Попробуйте запустить nm на всех файлах .o, которые входят в actor_avs_superscope.so, чтобы узнать, можете ли вы выяснить, какие исходные файлы генерируют ссылки на эти символы. –

ответ

1

Макросы обрабатываются на этапе предварительной обработки, который приходит перед связыванием. Поэтому, если редактор ссылок дает вам предупреждения о именах макросов, макросы не были расширены.

Чтобы увидеть результаты предварительной обработки, вы можете использовать флаг/E.Если ваши макросы были расширены, вы увидите строку:

visual_mem_free (priv); 

изменено на что-то вроде:

visual_mem_free_impl(priv, "filename.c", 32, "main"); 

Update

С вашего выхода нм/строк, файл actor_avs_superscope. o не есть проблема. Какие другие объекты (.o) и статические архивы (.a) используются для создания actor_avs_superscope.so? Вы должны запустить nm для всех из них, чтобы найти, у кого в нем есть нерасширенное имя макроса.

+0

Я скомпилировал с -E, и выходной файл выглядит как работа препроцессора. Я просмотрел, и кажется, что макросы расширены. Я обновлю вопрос, что находится в файле. – Scott

+0

Это единственный объект, создающий библиотеку. actor_avs_superscope.o – Scott

+0

Ой, подождите, просто нашел файл .a. Это похоже на проблему. (Это часть более крупного пакета.) – Scott

1

По ощущениям это не читает ваши #define с - попробуйте напечатать сообщение Inbetween их просто проверить.

Также проверьте порядок компиляции ваших файлов; звонит ли visual_mem_new0 после #define?

3

Макросы в коде C не приводят к символам в скомпилированных исполняемых файлах. Вероятно, что происходит, так это то, что какой-то код, который вы компилируете, не #include эти макросы, поэтому компилятор вывел, что они были функциями, и скомпилировал их. Вы можете использовать -Wall и -Werror, чтобы выполнять вызовы с неопределенными функциями.

+0

У меня было несколько предупреждений. Из них избавились, но символы все еще отсутствуют. Кроме того, если файлы не были включены, вызов 'visual_mem_new0' потерпит неудачу. – Scott

+0

+1 для -Wall и -Werror. Это помогает с таким количеством проблем. –

+0

Да, я использовал их, и они не помогают в этой ситуации. Как я уже сказал, я избавился от всех предупреждений/ошибок. Он компилируется с этими флагами, но у меня все еще есть первоначальная проблема, упомянутая в этом вопросе. – Scott

0

Ваша первая ошибка связана с установленной библиотекой, /usr/lib/libvisual-0.6/actor/actor_avs_superscope.so и похоже, что вы просматриваете местную библиотеку в своем проекте strings .libs/actor_avs_superscope.so. Попробуйте запустить строки против одного в /usr/lib, и вы, вероятно, увидите проблему.

Я бы либо установил вашу обновленную версию библиотеки, либо поместил ее в каталог LD_LIBRARY_PATH, когда вы запустили ее, что-то вроде $ LD_LIBRARY_PATH=./lib ./your_executable.

+0

строки в установленной библиотеке показывают то же самое – Scott