在Windows下,我们有一个C接口(extern"C"{// interface})到我们的C++库,它使用模块定义文件(.def)导出未编码的函数.
我试图在linux下重新创建相同的东西,我相对缺乏经验.据我所知,在NIX系统下,默认情况下会导出所有函数.考虑到这一点,我创建了一个共享对象,我通过nm命令运行.
我很惊讶地看到,与Windows不同,我的功能名称已被破坏!
我该怎么办呢?
我试图将使用gcc构建的.a库链接到使用g ++构建的程序.但是这个名字不同.我怎样才能做到这一点?谢谢,CP
据我所知,一个方法被编译成这样的函数:
+(NSArray *)arrayWithObject:(id)object;
// becomes
NSArray *_c_NSArray_arrayWithObject_(id object);
Run Code Online (Sandbox Code Playgroud)
是否有可能获得选择器函数的名称,以便我可以将该方法作为参数传递给C函数,或者这是不可能的?
根据我的类的当前实现,当我尝试使用类方法获取私有属性的值时,我将其None
作为输出。关于我哪里出错的任何想法?
代码
from abc import ABC, abstractmethod
class Search(ABC):
@abstractmethod
def search_products_by_name(self, name):
print('found', name)
class Catalog(Search):
def __init__(self):
self.__product_names = {}
def search_products_by_name(self, name):
super().search_products_by_name(name)
return self.__product_names.get(name)
x = Catalog()
x.__product_names = {'x': 1, 'y':2}
print(x.search_products_by_name('x'))
Run Code Online (Sandbox Code Playgroud) 我有.obj函数,它具有需要作为C++成员函数链接的所有东西.问题是,它在C中,因此使用它的类需要比正常名称更丑的东西.因此,我认为这只能通过两种方式完成:要么破坏C函数的名称和/或在符号表中添加额外的符号,否则它仍会使用它的原始名称.所以我仍然可以使用它的原始名称..所以基本上是这个名字.任何想法如何做到这一点或有一些完全其他方式来解决这个问题?请分享但是考虑在这个特殊情况下说extern"C"的有用性:))thx