在Windows上混合使用Qt和Objective-C

Mixing Qt and Objective-C on Windows

本文关键字:Qt Objective-C Windows 混合      更新时间:2023-10-16

我通常在OSX和iOS上开发应用程序。我发现Objective-C对许多任务都很有用,在许多情况下,它可以加快工作速度。

我想将我的应用程序也移植到Windows系统上。我意识到(如果你有其他解决方案,请告诉我!)Qt可能是一个非常有用的工具!使用Qt创建GUI既简单又快速。问题是Qt与C++配合使用,OSX与Objective-C配合使用。

我读到Qt可以处理Objective-C源,事实上,您可以找到OBJECTIVE_SOURCESOBJECTIVE_HEADERS makefile变量。

我搜索了如何配置QtCreator以接受.mm文件,但我无法使其工作。

.pro文件中,我有如下内容:

    ...
    OBJECTIVE_SOURCES += 
        test.mm
    INCLUDEPATH += "C:GNUStep...Headers" 
    LIBS += -L"C:GNUStep...Libraries" -lobjc -lgnustep-base
    QMAKE_CXXFLAGS += -fconstant-string-class=NSConstantString -std=c99
    ...

我非常简单的项目是一个小部件(.h.cpp),main.cpptest.h及其test.mm。为了混合C++和Objective-C,我考虑了一个"桥"(就像我在Cocoa中混合Objective-C和C++时所做的那样),所以我创建了test.h作为一个简单的头(没有Objective-C、只有一个桥):

    // test.h
    void testFunction( void );

比:

    // test.mm
    #import <Foundation/Foundation.h>
    void testFunction( void ) {
       NSString* string;
       string = @"This is a test string";
       NSLog( @"%@", string ); 
    }

最后:

    // main.cpp
    ...
    #include "test.h"
    ...
    testFunction();
    ...

链接器给了我经典的"对函数testFunction的未定义引用"。类似的东西无法链接从.mm文件创建的.o对象文件。

你们中的任何人能告诉我这个过程是否有问题吗?或者给我一个关于如何配置Qt以接受Objective-C语言的教程?

还有一个我非常喜欢的解决方案,它是纯Objective-C,即使用GNUStep-Gorm接口生成器,但不幸的是,使用Gorm构建的GUI完全无法使用Jaws或NVDA等辅助工具访问,我需要为视障人士创建一些应用程序!

非常感谢

链接器错误"未定义对函数testFunction的引用",我怀疑是由于缺少在testFunction中定义的东西。

您是对的,要将Objective-c与Qt混合,只需创建一个带有c函数的头和一个扩展名为.m或.mm的实现文件,就可以在其中编写Objective-c代码并引用.pro中Objective_SOURCES 下的实现

当您使用objective-c和NSString等类时,还需要链接到相关的框架。在这种情况下,它是基金会。

因此,在您的配置(.pro)文件中:-

LIBS += -framework Foundation 

如果你想添加另一个,比如Appkit,那么它将是:-

LIBS += -framework Foundation 
LIBS += -framework AppKit

当我混合语言时,我的.pro文件中唯一的其他添加是:-

QMAKE_CXXFLAGS += -F/Library/Frameworks
QMAKE_CFLAGS += -F/Library/Frameworks
QMAKE_LFLAGS += -F/Library/Frameworks

当你在测试函数实现中引用NSString时,你需要包括它的定义,所以只需将它添加到includes中,就像你通常在Objective-C程序中所做的那样:-

#import <Foundation/NSString.h>