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++ 中提供符号版本控制的内联命名空间。