带NDK的 Android 支持C/C++代码和iOS,Objective-C++也支持,那么我如何用Android和iOS之间共享的本机C/C++代码编写应用程序?
我有个问题.我有一个旧的Objective C项目,我想调用新的Swift函数和对象,我创建了文件"-Bridging-Header.h"和"-Swift.h"
我很容易将函数从Swift调用到Objective C,但我有一个反向问题.
所以我创建了一个简单的类"System.Swift"
import Foundation
@objc class System : NSObject {
@objc func printSome() {
println("Print line System");
}
}
Run Code Online (Sandbox Code Playgroud)
现在我已经尝试按照这里的文档和<...> - Swift.h文件内部写了这个
@class System;
@interface System : NSObject
-(void)printSome;
@end
Run Code Online (Sandbox Code Playgroud)
我已经在Objective C Class中导入了它.此时,在我的Objective C Code的Objective C类(当前为UIViewController)中,我尝试调用"printSome"方法:
- (void)viewDidLoad
{
[super viewDidLoad];
System * sis = [[System alloc] init];
[sis printSome];
//any additional setup after loading the view from its nib.
}
Run Code Online (Sandbox Code Playgroud)
现在我有以下错误:
架构i386的未定义符号:"_ OBJC_CLASS _ $ _ System",引用自:"ObjectiveC_Class_That_Call_Swift_Object"中的objc-class-ref .o ld:未找到架构i386 clang的符号:错误:链接器命令失败,退出代码为1(使用-v看到调用)
有人能帮帮我吗?
关心所有.
是否可以在同一个项目中使用所有4种语言,如果是,如何使用?
这个问题有类似的问题:我可以将Swift与C++混合使用吗?就像Objective-C .mm文件一样,接受的答案是否定的.
利用Bridging Header充分,.h不包含C++报表,Objective-C包装时.h不包含C++,.mm文件做实际的包装C++类,并且.swift,可以在4种语言(5如果包括Objective-C++)建立并链接到一个单一的可执行文件?
在我的xcode项目中添加OpenCV 2框架后,我尝试搜索samlpes或教程以与swift集成.
有没有相同的好教程?
我们可以很容易地在Qt中使用Objective-C和C++.
观看了Apple的许多WWDC 2015演讲,我预计Swift将取代OS-X(和iOS)开发的Objective-C; 所有的演示都使用了Swift.
考虑到你可以一起使用Objective-C和Swift,使用桥接头,是否可以在Qt项目中编译Swift代码并使用C++访问Swifts的第一类对象(Classes,Structs,Enums等)?
如果有可能...
从Qt调用Objective-C函数需要将代码包装在C函数中,并从Qt调用C头.
从Objective-C调用Swift需要一个桥接头来表示哪些Swift文件可用.然后在XCode项目中引用此标头; 我们可以在Qt .pro中做到这一点,如果是这样,怎么样?
假设我们可以指定桥接头,我们仍然只能从Objective-C文件调用Swift,但是可以直接从Qt中调用Swift,在C++中?
有没有办法编译本机C或C++代码并将其暴露给Linux上的Swift?我可以看到像libdispatch这样的几个Apple库是用纯C编写的,只要导入它们就可以在Swift中访问它们.
要设置示例,假设我有两个文件Car.c并Car.h定义了名为的结构Car.有没有办法可以编译它们并通过编写import语句在Swift中使用它们?
import Car
Run Code Online (Sandbox Code Playgroud)
我试着写module.modulemap里面目录下的文件.c,.h并且Package.swift文件位于:
module Car {
header "Car.h"
export *
}
Run Code Online (Sandbox Code Playgroud)
并运行swift build.这个产量误差:
<unknown>:0: error: unexpected 'commands' value (expected map)
<unknown>:0: error: unable to load build file
Run Code Online (Sandbox Code Playgroud)
我正在使用Swift 3.0-dev版本(2016年3月24日)
[更新1]
我已经联系了Max(mxcl) - Swift Package Manager的创建者之一,他告诉我要删除modulemap它.c并将.h文件直接放在Sources文件夹中.我编译完这个包后,但它不能用作模块.此外,我无法调用文件中的任何已定义函数.h.
我应该如何从Swift文件中调用C++函数(不涉及类)?我试过这个:
在someCFunction.c中:
void someCFunction() {
printf("Inside the C function\n");
}
void aWrapper() {
someCplusplusFunction();
}
Run Code Online (Sandbox Code Playgroud)
在someCpluplusfunction.cpp中:
void someCplusplusFunction() {
printf("Inside the C++ function");
}
Run Code Online (Sandbox Code Playgroud)
在main.swift中:
someCFunction();
aWrapper();
Run Code Online (Sandbox Code Playgroud)
在Bridging-Header.h中:
#import "someCFunction.h"
#import "someCplusplusFunction.h"
Run Code Online (Sandbox Code Playgroud)
我发现这个答案非常有用,但我仍然无法使其发挥作用.你能指出我正确的方向吗?
谢谢!
我有一个 C++ 头文件(名为header.h),我想将其包含到我的 Swift 项目中。
由于我想要包含的 C++ 框架尚未完成,所以我现在只有头文件。
我的 C++ 头文件header.h看起来有点像这样:
#include <vector>
struct someStruct{
float someAttr;
}
class someClass{
public:
enum SomeEnum{
Option1,
Option2
}
void someFunc(const double value) {}
}
Run Code Online (Sandbox Code Playgroud)
问题是,当我尝试将header.h文件包含在 中时,project-Bridging-Header.h它永远找不到我包含在 header.h 中的向量
我尝试重命名header.h为header.hpp. 我尝试在右侧面板中将桥接标头类型设置为 C++ 标头。但他们都没有帮助。
我希望你们中的一些人可以帮助我找出我做错了什么。
我无法使用新版本的opencv 3.0.0框架构建项目(版本2没有此问题).Xcode 7不会将c ++源代码编译为c ++.
这是最简单的设置:
Objective-C++源和标头并将它们添加到项目中.这是设置:
以下是编译器所说的内容:
opencv2.framework/Headers/core/base.hpp:49:4: error: base.hpp header must be compiled as C++
Run Code Online (Sandbox Code Playgroud)
这是为什么?我有.mm文件,它应该编译为Objective-C++源代码.
可以在Objective-C++(.mm)文件中调用Swift代码吗?有没有简单的解决方法,如果没有?
我有一个Xcode项目,它是Swift,Objective-C和C++的混合体.我没有问题从Objective-C到Swift用-Bridging-Header.h或从Swift到Objective-C用-Swift.h.
但我有一个.mm文件,它是Objective-C++.当我尝试#import "[ProductName]-Swift.h"它时会在-Swift.h文件中抛出许多编译错误,例如:
找不到'NSApplicationDelegate'的协议声明,你的意思是'NSConnectionDelegate'吗?
没有名为'NSTableViewDataSource'的类型协议
等等...
我已经研究了其他几个类似的问题,例如我可以将Swift与C++混合使用吗?就像Objective - C .mm文件一样,它似乎没有给我一个明确的答案或解决方案.
在我看来,我目前的解决方法是在Objective-C中创建一个使用Swift代码然后将其导入Objective-C++代码的包装器对象.
我想用 C 或 C++ 编写一些本机代码,以便在 iOS 上与 Swift 一起使用。这段代码主要从 Swift 调用,但也需要回调到 Swift。
将 Swift 与这两种语言中的每一种进行交互的机制是什么?
在这种接口中,C 或 C++ 中哪一个的约束最少,为什么?跨语言调用是否有性能差异?