2013-12-20 33 views
0

我正在尝试向c文件添加一个新函数“pa_context_set_sink_input_paused”。这个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”。

我无法理解发生了什么。你能帮助我吗?

感谢, Sathish所在

更新: -

谢谢你们,

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 ?? 

感谢, Sathish所在

+0

可以显示的代码? – tristan

+0

该代码有大约一千行..如果我在这里粘贴代码,我不会看起来不错。我添加了我添加的特定功能。 c文件和头文件是pulseaudio更大的构建系统的一部分。 – Sathish

+0

您是否将'pa_context_set_sink_input_paused()'添加到'pa_listclients_pause.c'中? – alk

回答

1

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

在我的shar ED库:

static void test_func_1() 
{ 
} 

void test_func_2() 
{ 
} 

纳米显示:

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() 
{ 

} 

和建筑

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

当与该库链接主程序-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() 
+0

感谢您的回答。但我有疑问。我没有明确地将其设置为静态。有没有其他方式可以将其定义为本地符号? – Sathish

+0

当你构建你的程序时,你使用'-fvisibility = hidden'吗?你说你不使用静态,所以我想你以某种方式隐藏你的功能。我知道gcc中有选项-fvisibility,它会影响符号的可见性。你可以看到它的描述:http://gcc.gnu.org/wiki/Visibility –

+0

谢谢,这帮助我.. – Sathish