【问题标题】:Undefined reference -- Local symbol未定义的引用——局部符号
【发布时间】:2014-01-08 20:57:36
【问题描述】:

我正在尝试将新函数“pa_context_set_sink_input_paused”添加到 c 文件中。这个 c 文件是 pulseaudio 的一部分。我也能够成功编译pulseaudio。

我添加到 c 文件中的代码(其中定义了许多其他函数,并且这些函数被声明为全局)。

pa_operation* pa_context_set_sink_input_paused(pa_context *c, uint32_t idx, int pause, pa_context_success_cb_t cb, void *userdata) 
{
  pa_operation *o;
  pa_tagstruct *t;
  uint32_t tag;

  pa_assert(c);
  pa_assert(PA_REFCNT_VALUE(c) >= 1);

  PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
  PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
  PA_CHECK_VALIDITY_RETURN_NULL(c, idx != PA_INVALID_INDEX, PA_ERR_INVALID);
  //PA_CHECK_VALIDITY_RETURN_NULL(c, pa_cvolume_valid(volume), PA_ERR_INVALID);
PA_CHECK_VALIDITY_RETURN_NULL(c, c->version >= 11, PA_ERR_NOTSUPPORTED);

  o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);

  t = pa_tagstruct_command(c, PA_COMMAND_SET_SINK_INPUT_PAUSE, &tag); // ADD A NEW COMMAND 
  pa_tagstruct_putu32(t, idx);
  pa_tagstruct_puts(t, NULL);
  pa_tagstruct_put_boolean(t, pause);
  pa_pstream_send_tagstruct(c->pstream, t);
  pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);

  return o;
}

在头文件中,函数是这样声明的

/** Set the pause of a sink input stream specified by its index */

pa_operation* pa_context_set_sink_input_paused(pa_context *c, uint32_t idx, int pause,   pa_context_success_cb_t cb, void *userdata); //ADDED BY SATHISH

像这样编译:

$ gcc pa_listclients_pause.c -o pa_listclients_pause -L /home/sathish/Desktop/pulseaudio-4.0/build/src/.libs/ -lpulse
 /tmp/ccueP47b.o: In function `pa_get_devicelist':
 pa_listclients_pause.c.text+0x6cb): undefined reference to `pa_context_set_sink_input_paused'
 collect2: error: ld returned 1 exit status

但是当我尝试使用这个新函数运行程序时,它返回给我“未定义的引用”。

我尝试运行 nm 命令并检查 libpulse.so 中是否存在新函数

函数返回我找到它..

$ nm -A *.so | grep "pa_context_set_sink_input_paused"
libpulse.so:0001d4a0 **t** pa_context_set_sink_input_paused

它被标识为带有字母“t”的本地符号。

我无法理解正在发生的事情。你能帮我解决这个问题吗?

谢谢, 萨蒂什

更新:-

谢谢各位,

Your pointers helped me to narrow down close to a solution.. I edited my Makefile process to expose my new function as a "GLOBAL SYMBOL". 

In explanation, there was a file named "map-file" which holding which functions become as global and local. I added my function into the global part of the file.. These seems to have temporarily solved the issue..

I have added the new error I am facing as a seperate question.

http://stackoverflow.com/questions/20702888/relocation-error-while-running-binary

Any pointers on the new issue ??

谢谢, 萨蒂什

【问题讨论】:

  • 你能显示代码吗?
  • 代码大约有几千行。如果我将代码粘贴到这里,我会看起来不太好。我已经添加了我添加的特定功能。 c文件和头文件是pulseaudio更大的构建系统的一部分..
  • pa_listclients_pause.c 你添加了pa_context_set_sink_input_paused() 吗?
  • 否,pa_context_set_sink_input_paused() 已添加到另一个 c 文件中。这个 c 文件公开了这个 C API pa_context_set_sink_input_paused(),它被 pa_listclients_pause.c 中的一个函数访问。

标签: c linux gcc pulseaudio


【解决方案1】:

这是演示类似问题的示例:

在我的共享库中:

static void test_func_1()
{
}

void test_func_2()
{
}

纳米显示:

>nm -C ./libmylib.so |  grep test
000000000000062a T test_func_2()
0000000000000624 t test_func_1()

以及何时将主程序与该库链接:

int main()
{
  test_func_1();
  test_func_2();

  return 0;
}



>g++ -g -m64 main.cpp -o main -L. -lmylib
/tmp/cciphwuO.o: In function `main':
/main.cpp:32: undefined reference to `test_func_1()'
collect2: ld returned 1 exit status

或者:

void test_func_1()
{

}
void __attribute__ ((visibility ("default"))) test_func_2()
{

}

并使用 -fvisibility 构建:

g++ -fvisibility=hidden -m64 -shared -g -fpic mylib.cpp -o libmylib.so

给出同样的问题:

>nm -C ./libmylib.so | grep test
00000000000005c4 t test_func_1()
00000000000005ca T test_func_2()

【讨论】:

  • 感谢您的回答。但我有一个疑问。我没有明确地将其设置为静态。是否有任何其他方式可以将其定义为本地符号??
  • 您在构建程序时使用-fvisibility=hidden 吗?你说你不使用静态所以我猜你以某种方式隐藏你的功能。我知道 gcc 中有一个选项 -fvisibility 会影响符号的可见性。你可以看到它的描述:gcc.gnu.org/wiki/Visibility
猜你喜欢
  • 1970-01-01
  • 2019-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-12
  • 2017-11-26
相关资源
最近更新 更多