我尝试使用
创建具有相同功能的两个版本的库__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;
}
这是版本scripf文件
LIBSIMPLE_1.0{
global:
first; second;
local:
*;
};
LIBSIMPLE_2.0{
global:
first;
local:
*;
};
使用gcc构建库时,一切运行良好,并且我能够链接到库二进制文件。使用nm工具,我看到导出了 first()和 second()函数符号。 现在,当我尝试使用g ++时,会导出非符号。 所以我试图使用extern&#34; C&#34;包含两个声明的指令
extern "C" {
int first(int x);
int second(int x);
}
nm表示导出了 second()函数符号,但 first()仍然未导出和损坏。
这里有什么我想要让它起作用?或者用c ++编译器实现这一点是不可能的?
答案 0 :(得分:1)
我不知道为什么,以及&#34;&#34;&#39;&#39;&#39;第一&#39;没有出口 - 怀疑还有其他东西在干扰。
否则C ++名称错误肯定是一种痛苦。 &#39; asm &#39;指令(AFAIK)需要C ++函数的错位名称,而不是简单的C&#39;名称。所以&#39; int first(int)&#39;需要引用为(例如)&#39; _Z5firsti&#39;而不仅仅是“第一次”#。当然,就便携性而言,这是一个真正的痛苦......
链接器映射文件更加宽容,因为它支持的&#34; extern&#34; C ++&#34; {...}&#39;块以列出的形式列出C ++符号 - &#39; int first(int)&#39;。
整个过程是一场维持噩梦。我真正喜欢的是一个函数属性,可用于指定别名和版本......
只是添加提醒,C ++ 11现在支持内联命名空间,可用于在C ++中提供符号版本控制。