我已经学习了如何生成共享库。我添加了一些小东西,因为我想测试一些东西。以下是ma源代码:
强文本
#ifndef foo_h__
#define foo_h__
void foo(void);
class CFoo
{
public:
void fooing1();
void fooing2(int a);
void fooing3(int a, int b = 0);
};
#endif // foo_h__
食品cpp
#include <stdio.h>
#include "foo.h"
void foo(void)
{
puts("Hello, I'm a shared library");
}
void CFoo::fooing1()
{
puts("CFoo::fooing1()");
}
void CFoo::fooing2(int a)
{
printf("CFoo::fooing2(%d)\n", a);
}
void CFoo::fooing3(int a, int b)
{
printf("CFoo::fooing3(%d, %d)\n", a, b);
}
主c
#include <stdio.h>
#include "foo.h"
int main(void)
{
puts("This is a shared library test...");
foo();
CFoo *foo1 = new CFoo();
foo1->fooing1();
foo1->fooing2(12);
foo1->fooing3(1);
foo1->fooing3(1, 2);
delete foo1;
return 0;
}
以及构建脚本
g++ -c -Wall -Werror -fpic foo.cpp
g++ -shared -o libfoo.so foo.o
g++ -Wall -o test main.c -lfoo -L.
当输入命令
nm -D libfoo.so | c++filt
时,我得到以下输出: 0000000000201040 B __bss_start
w __cxa_finalize
0000000000201040 D _edata
0000000000201048 B _end
0000000000000818 T _fini
w __gmon_start__
0000000000000640 T _init
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
w _Jv_RegisterClasses
U printf
U puts
0000000000000796 T foo()
00000000000007a8 T CFoo::fooing1()
00000000000007c2 T CFoo::fooing2(int)
00000000000007ea T CFoo::fooing3(int, int)
我有两个问题:
1)为什么
printf
和puts
的函数名前面有一个U
?函数名前是否有一个“foo()
”、“CFoo::fooing1()
”、“CFoo::fooing2(int)
和“CFoo::fooing3(int, int)
”?2)如何在
T
函数之前获得U
? 最佳答案
符号printf
和puts
在您生成的库代码中未定义的letter U means。这是正常的,因为它们是在另一个共享库中定义的。
字母T表示代码是在库文件中定义的(文本部分实际上对应于代码;不应与数据部分混淆)。
如果CFoo函数是共享库的核心内容,那么最好避免在库中将它们设为U。如果你仍然想做到这一点:
保持在类头中声明的CFoo
函数
完全删除它的infoo.cpp
:代码将被编译,但函数丢失(即在库文件中根本没有定义它)
但从CFoo
中的另一个foo.cpp
函数调用此函数:代码将编译,这次库文件将此函数定义为U:需要一个定期声明但尚未找到的符号。