我正在尝试用Objective-C来包装一个C++库(用于Sybase Ultralite),以便该库可以被导入到MonoTouch中。我创建了一个Objective-C库,并在该项目中包含了编译好的C++库,libulrt.a。为了使我的项目编译通过,我将用户头文件搜索路径设置为指向C++头文件所在的目录。然后,我不得不将编译源代码设置为Objective-C++。
现在的问题是,虽然包装库正确地编译了,但一旦我将其包含到另一个Xcode项目中,我就必须再次将编译源代码设置为Objective-C++,否则使用我的包装库的项目会出现链接错误。我不明白为什么会这样,因为我的包装库的头文件只包含Objective-C代码,根本没有C++代码。C++代码只出现在包装库的实现(*.mm文件)中。我需要做什么才能使C++实现对使用包装库的项目完全透明?换句话说,我想能够包含我的包装库并将编译源代码设置为Objective-C进行编译。有什么想法如何做到这一点吗?
当我编译使用我的包装库的项目时,我遇到的链接错误如下: (由于错误列表太长,我把它缩短了!)
我的包装库的头文件如下所示:
有没有办法在编译时将这个库以Objective-C++的形式进行编译,但是在项目中使用时仍能被视为Objective-C呢?
现在的问题是,虽然包装库正确地编译了,但一旦我将其包含到另一个Xcode项目中,我就必须再次将编译源代码设置为Objective-C++,否则使用我的包装库的项目会出现链接错误。我不明白为什么会这样,因为我的包装库的头文件只包含Objective-C代码,根本没有C++代码。C++代码只出现在包装库的实现(*.mm文件)中。我需要做什么才能使C++实现对使用包装库的项目完全透明?换句话说,我想能够包含我的包装库并将编译源代码设置为Objective-C进行编译。有什么想法如何做到这一点吗?
当我编译使用我的包装库的项目时,我遇到的链接错误如下: (由于错误列表太长,我把它缩短了!)
"operator delete(void*)", referenced from:
zc3db40339fee::~zc3db40339fee()in libUltralite.a(ee39bf4763.o)
zb4297ee7d543::~zb4297ee7d543()in libUltralite.a(747e80fdad.o)
z33836a0a6f46::~z33836a0a6f46()in libUltralite.a(f240efda30.o)
"___cxa_pure_virtual", referenced from:
vtable for ze78b0ec59364in libUltralite.a(2c50e8e8ff.o)
vtable for ze78b0ec59364in libUltralite.a(2c50e8e8ff.o)
vtable for ze78b0ec59364in libUltralite.a(2c50e8e8ff.o)
我的包装库的头文件如下所示:
#import <Foundation/Foundation.h>
@interface DataAccess : NSObject {}
// Release objects.
- (void)dealloc;
// Singleton instance of the DataAccess class.
+ (DataAccess*)sharedInstance;
// Finalize the Database Manager when done with the DB.
+ (void)fini;
// Adds the given name to the database.
- (void)addName:(NSString *)name;
@end
有没有办法在编译时将这个库以Objective-C++的形式进行编译,但是在项目中使用时仍能被视为Objective-C呢?