【问题标题】:C++ shared library symbols versioningC++ 共享库符号版本控制
【发布时间】:2016-09-26 09:28:30
【问题描述】:

我正在尝试使用

创建具有相同功能的两个版本的库
__asm__(".symver ......

接近

图书馆.h

#ifndef CTEST_H
#define CTEST_H

int first(int x);
int second(int x);

#endif

库.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;
}

这里是版本 scripf 文件

LIBSIMPLE_1.0{
    global:
    first; second;
    local:
    *;
};

LIBSIMPLE_2.0{
    global:
    first;
    local:
    *;
};

当使用 gcc 构建库时,一切正常,并且我能够链接到库二进制文件。使用 nm 工具,我看到 first()second() 函数符号都已导出。 现在,当我尝试使用 g++ 时,没有导出任何符号。 所以我尝试使用 extern "C" 指令来包装两个声明

extern "C" {

int first(int x);
int second(int x);
}

nm 显示 second() 函数符号已导出,但 first() 仍保持未导出和损坏。

我在这里缺少什么才能使它起作用?还是用c++编译器不可能做到这一点?

【问题讨论】:

    标签: gcc g++ shared-libraries linker-scripts


    【解决方案1】:

    我不知道为什么,使用 'extern "C"','first' 没有被导出 - 怀疑有其他干扰。

    否则,C++ 名称修改在这里肯定会很痛苦。 'asm' 指令 (AFAIK) 需要 C++ 函数的错位名称,而不是简单的 'C' 名称。所以'int first(int)'需要被引用为(例如)'_Z5firsti'而不是'first'。当然,就便携性而言,这是一个真正的痛苦......

    链接器映射文件更宽容,因为它支持的“extern "C++" {...}' 块以书面形式列出 C++ 符号 - 'int first(int)'。

    整个过程是维护的噩梦。我真正想要的是一个函数属性,它可以用来指定别名和版本......


    只是提醒一下,C++11 现在支持内联命名空间,可用于在 C++ 中提供符号版本控制。

    【讨论】:

      猜你喜欢
      • 2011-01-28
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-02
      • 2018-04-14
      • 2010-11-18
      • 1970-01-01
      相关资源
      最近更新 更多