недостающие символы, которые должны быть там - PullRequest
1 голос
/ 18 января 2010

Я в тупике. Вот вывод команды 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);

Есть какие-нибудь подсказки?

Edit: 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:

$ 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

Ответы [ 4 ]

3 голосов
/ 18 января 2010

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

1 голос
/ 18 января 2010

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

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

visual_mem_free (priv);

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

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

Обновление

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

1 голос
/ 18 января 2010

Такое ощущение, что он не читает ваши #define с - попробуйте напечатать сообщение между ними, чтобы проверить.

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

0 голосов
/ 19 января 2010

Ваша первая ошибка в отношении установленной библиотеки, /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.

...