GNU构建系统问题

时间:2010-06-30 07:14:03

标签: c linker

如何找到包含特定功能定义的库?我收到链接器错误。

3 个答案:

答案 0 :(得分:4)

您可以使用nm命令行工具列出二进制文件中的导出符号:

~/src> cat nm-test.c

static int plus_four(int x)
{
        return x + 4;
}

int sum_plus_four(int a, int b)
{
        return plus_four(a + b);
}

int product_plus_four(int a, int b)
{
        return plus_four(a * b);
}
~/src> gcc -c nm-test.c
~/src> nm ./nm-test.o
00000000 t plus_four
00000023 T product_plus_four
0000000b T sum_plus_four

根据the manual,'t'表示符号位于代码(文本)段中,大写表示它是公共的。

如果您有要查找的符号,则可以使用nm使图书馆导出的符号可以访问,例如grep的:

$ find -name lib*.a /example/library/path | xargs nm | grep -E "T $SYMBOL_TO_FIND"

此命令行是未经测试的草图,但它应显示概念。

答案 1 :(得分:1)

如果它是C标准API的一部分,那么只需运行man,它应该清楚地说明函数的定义位置。

答案 2 :(得分:1)

如果您想以非程序化方式查找库,您可能会发现LSB Navigator很有用。在搜索框中输入该功能,然后检查绿色“状态”行中的库。

http://coldattic.info/pic/165509391387.png

这将是包含该功能的“常规”库(在上面的示例中,librtmq_unlink的正确库,因此您链接到-lrt)。只需链接到该库,它几乎可以在所有Linux系统上运行。

注意:我是我推荐的工具的开发人员之一。