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が欠落しているという1行があります。もう1つは、visual_mem_malloc0が欠落していると言っていますが、コードは実際にはvisual_mem_new0を呼び出しています。これは、visual_mem_new0が表示されていることを示しています。

priv = visual_mem_new0 (SuperScopePrivate, 1);

visual_mem_free (priv);

手がかりはありますか?

編集:バンピング..多分いくつかの新鮮な目が役立つことができますか?

編集:ちなみに、コンパイル中やリンク中に警告/エラーは発生しません。

編集:プリプロセッサの出力からのスニペットをいくつか示します。

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

4 に答える 4

3

Cコードのマクロは、コンパイルされた実行可能ファイルにシンボルを生成しません。おそらく何が起こっているのかというと、コンパイルしている一部のコードが#includeこれらのマクロを持っていなかったため、コンパイラーはそれらが関数であると推測し、それらへの呼び出しをコンパイルしました。を使用-Wall-Werrorて、未定義の関数を呼び出すと、コンパイルに失敗します。

于 2010-01-18T19:15:14.387 に答える
1

マクロは、リンク前の前処理フェーズで処理されます。したがって、リンクエディタがマクロ名に関する警告を表示している場合、マクロは展開されていません。

前処理の結果を確認するには、/Eフラグを使用できます。マクロが展開されている場合は、次の行が表示されます。

visual_mem_free (priv);

次のようなものに変更されました:

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

アップデート

nm / 文字列の出力から、ファイルactor_avs_superscope.oは問題のある場所ではありません。他にどのようなオブジェクト(.o)ファイルと静的アーカイブ(.a)を使用してactor_avs_superscope.soを作成しますか?展開されていないマクロ名が含まれているユーザーを見つけるには、それらすべてに対してnmを実行する必要があります。

于 2010-01-18T20:30:24.213 に答える
1

あなたのを読んでいないように感じます#define-確認するためだけにそれらの間にメッセージを印刷してみてください。

また、ファイルのコンパイル順序も確認してください。visual_mem_new0sの後に来る呼び出しはあります#defineか?

于 2010-01-18T09:16:17.720 に答える
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

于 2010-01-18T21:20:32.057 に答える