C++ 共享库符号版本控制
C++ shared library symbols versioning
我正在尝试使用
创建具有相同函数的两个版本的库
__asm__(".symver ......
方法
library.h
#ifndef CTEST_H
#define CTEST_H
int first(int x);
int second(int x);
#endif
library.cpp
#include "simple.h"
#include <stdio.h>
__asm__(".symver first_1_0,first@LIBSIMPLE_1.0");
int first_1_0(int x)
{
printf("lib: %s\n", __FUNCTION__);
return x + 1;
}
__asm__(".symver first_2_0,first@@LIBSIMPLE_2.0");
int first_2_0(int x)
{
int y;
printf("lib: %d\n", y);
printf("lib: %s\n", __FUNCTION__);
return (x + 1) * 1000;
}
int second(int x)
{
printf("lib: %s\n", __FUNCTION__);
return x + 2;
}
这里是版本脚本文件
LIBSIMPLE_1.0{
global:
first; second;
local:
*;
};
LIBSIMPLE_2.0{
global:
first;
local:
*;
};
当使用 gcc 构建库时,一切正常,我能够 link 到库二进制文件。使用 nm 工具,我看到 first() 和 second() 函数符号都已导出。
现在,当我尝试使用 g++ 时,没有导出任何符号。
所以我尝试使用 extern "C" 指令来包装两个声明
extern "C" {
int first(int x);
int second(int x);
}
nm 显示 second() 函数符号已导出,但 first() 仍未导出且被损坏。
我缺少什么才能让它发挥作用?或者用c++编译器不可能实现这个?
我不知道为什么,'extern "C"','first' 没有导出 - 怀疑有其他干扰。
否则,C++ 名称重整在这里肯定很痛苦。 'asm' 指令 (AFAIK) 需要 C++ 函数的错位名称,而不是简单的 'C' 名称。因此 'int first(int)' 需要被引用为(例如)'_Z5firsti' 而不仅仅是 'first'。就便携性而言,这当然是一个真正的痛苦......
链接器映射文件更加宽容,因为其支持的 'extern "C++" {...}' 块以书面形式列出 C++ 符号 - 'int first(int)'.
整个过程是一场维护噩梦。我真正想要的是一个可用于指定别名和版本的函数属性...
提醒一下,C++11 现在支持可用于在 C++ 中提供符号版本控制的内联命名空间。
我正在尝试使用
创建具有相同函数的两个版本的库__asm__(".symver ......
方法
library.h
#ifndef CTEST_H
#define CTEST_H
int first(int x);
int second(int x);
#endif
library.cpp
#include "simple.h"
#include <stdio.h>
__asm__(".symver first_1_0,first@LIBSIMPLE_1.0");
int first_1_0(int x)
{
printf("lib: %s\n", __FUNCTION__);
return x + 1;
}
__asm__(".symver first_2_0,first@@LIBSIMPLE_2.0");
int first_2_0(int x)
{
int y;
printf("lib: %d\n", y);
printf("lib: %s\n", __FUNCTION__);
return (x + 1) * 1000;
}
int second(int x)
{
printf("lib: %s\n", __FUNCTION__);
return x + 2;
}
这里是版本脚本文件
LIBSIMPLE_1.0{
global:
first; second;
local:
*;
};
LIBSIMPLE_2.0{
global:
first;
local:
*;
};
当使用 gcc 构建库时,一切正常,我能够 link 到库二进制文件。使用 nm 工具,我看到 first() 和 second() 函数符号都已导出。 现在,当我尝试使用 g++ 时,没有导出任何符号。 所以我尝试使用 extern "C" 指令来包装两个声明
extern "C" {
int first(int x);
int second(int x);
}
nm 显示 second() 函数符号已导出,但 first() 仍未导出且被损坏。
我缺少什么才能让它发挥作用?或者用c++编译器不可能实现这个?
我不知道为什么,'extern "C"','first' 没有导出 - 怀疑有其他干扰。
否则,C++ 名称重整在这里肯定很痛苦。 'asm' 指令 (AFAIK) 需要 C++ 函数的错位名称,而不是简单的 'C' 名称。因此 'int first(int)' 需要被引用为(例如)'_Z5firsti' 而不仅仅是 'first'。就便携性而言,这当然是一个真正的痛苦......
链接器映射文件更加宽容,因为其支持的 'extern "C++" {...}' 块以书面形式列出 C++ 符号 - 'int first(int)'.
整个过程是一场维护噩梦。我真正想要的是一个可用于指定别名和版本的函数属性...
提醒一下,C++11 现在支持可用于在 C++ 中提供符号版本控制的内联命名空间。