链接 C++ 构造函数时出现 Objective-C++ 未定义符号

问题描述 投票:0回答:1

亲爱的 StackOverflow 社区,

在构建我正在处理的跨平台项目的 Mac 版本时,我遇到了奇怪的链接器错误。跨平台代码是用 C++ 开发的,我使用 Objective-C 中的 Apple AppKit 来管理 UI 前端。 作为示例,我有一个名为 UILabel 的 C++ 类,定义如下:

#pragma once
#include "CoreApplication/Views/Elements/UIElement.h"
namespace CoreApplication {
class UILabel : public UIElement {
    UILabel( const UIIdentifier identifier );
    ~UILabel( void );
...

实际代码在UILabel.cpp中:

#include "CoreApplication/Views/Elements/UILabel.h"
#if( TARGET_OS == MICROSOFT_WINDOWS_OS )
...
#elif( TARGET_OS == APPLE_MAC_OS )
    #include "CoreApplication/Views/UIMacTarget.h"
#endif
namespace CoreApplication {
UILabel::UILabel( const UIIdentifier identifier )
    : UIElement( identifier )
    , _label( NULL )
    , _textAlignment( TextAlignmentType::Void )
    , _textWeight( TextWeightType::Void )
{
    M_LOG_CONSTRUCTOR
    _CreateHostUIElement();
    _ConnectHostUIElement();
    // Default text attributes:
    SetTextAlignment( TextAlignmentType::Left );
    SetTextWeight( TextWeightType::Normal );
}
...

在 Objective-C++ 文件 (.mm) 中实例化新的 UILabel 对象时,我收到来自 clang 的以下消息:

ld:未定义的符号: CoreApplication::UILabel::UILabel(unsigned int),引用自: -[AppDelegate applicationDidFinishLaunching:] 在 AppDelegate.o

AppDelegate.mm 文件中的 Objective-C 代码是:

#import "CoreApplication/Views/Elements/UILabel.h"
using namespace CoreApplication;
@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    UILabel label( kNullUIIdentifier );
    Pointer hLabel = CreateMacUILabel( label );
    label.SetLabel( CSTR("Hello Macintosh") );
...

有趣的是,我还使用“中性”String 类来处理 Windows 和 MacOS,定义如下:

#include "CoreServices/Streams/MutableData.h"
namespace CoreServices {
class String : public MutableData {
public:
    String( void );
    String( const String & source );
    String( const char * source );
...

并且同一 AppDelegate 方法中的以下代码可以毫无问题地链接:

using namespace CoreServices;
@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    String coreServicesInput( "Hello Macintosh" );
...

我检查了 Xcode 中的构建阶段顺序,但一切似乎都正常:我在这里做错了什么?

我非常感谢您对此的帮助!

不用说,此代码在使用 Visual Studio 和 C++/winRT UWP 的 Windows 上运行良好...

致以诚挚的问候,

阿诺

PS:所有代码都在同一个项目中编译/链接:这里没有库......

c++ xcode macos appkit objective-c++
1个回答
0
投票

谢谢大家的回答和评论。 该问题源于 Mac 上下文中错误的 uint32 类型定义。在某些条件 #if/#endif 标头部分中,它不是 unsigned int,而是 unsigned long。

© www.soinside.com 2019 - 2024. All rights reserved.