当前位置: 技术问答>linux和unix
linux共享库含有类(version script) 抛砖引玉!
来源: 互联网 发布时间:2017-03-06
本文导语: 本帖最后由 yuanhaosh 于 2012-07-30 15:35:15 编辑 这是我的代码 在最后编译有问题 #include"stdio.h" void foo_v1(int f) { printf("foo_v1n"); } __asm__(".symver foo_v1,foo@@VERSION_1.1"); class Clock { public:void SetTime(int NewH, int New...
#include"stdio.h"
void foo_v1(int f) {
printf("foo_v1n");
}
__asm__(".symver foo_v1,foo@@VERSION_1.1");
class Clock
{
public:void SetTime(int NewH, int NewM, int NewS);
};
void Clock::SetTime(int H, int M, int S)
{
int Hour = H;
int Minute = M;
int Second = S;
printf("%d %d %d", Hour, Minute, Second);
}
__asm__(".symver SetTime ,SetTime@@VERSION_1.1");
//这是上边说的1.ver
VERSION_1.1{
global:
foo;
Clock::*;
};
上边两个可以通过下面编译指令
gcc -shared -fPIC -o libfoo.so.1.1 -Wl,--soname='libfoo.so.1' -Wl,--version-script=1.ver foo.c
可是在主函数这里编译连接时报错
#include
class Clock;
void foo(int);
int main()
{
Clock myClock;
foo(100);
myclock.SetTime(10, 12, 14);
return 0;
}
main.cpp: In function `int main()':
main.cpp:6: error: aggregate `Clock myClock' has incomplete type and cannot be defined
望各位高手,帮我修改使之正确
|
这个导出也不知道如何处理,参看另一个帖子的回复。
|
还要创建linkname
ln -sf libfoo.so.1 libfoo.so
然后在编译main的时候要-L. -lfoo指定。
|
分开头文件。
Clock.h
Clock.cpp
g++ -fPIC -shared -o libfoo.so.1.1 -Wl,-soname=libfoo.so.1,--version-script=1.ver Clock.cpp
Clock.h
class Clock
{
public:void SetTime(int NewH, int NewM, int NewS);
};
Clock.cpp
#include"stdio.h"
#include "Clock.h"
void foo_v1(int f) {
printf("foo_v1n");
}
__asm__(".symver foo_v1,foo@@VERSION_1.1");
void Clock::SetTime(int H, int M, int S)
{
int Hour = H;
int Minute = M;
int Second = S;
printf("%d %d %d", Hour, Minute, Second);
}
__asm__(".symver SetTime ,SetTime@@VERSION_1.1");
g++ -fPIC -shared -o libfoo.so.1.1 -Wl,-soname=libfoo.so.1,--version-script=1.ver Clock.cpp