亲爱的 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:所有代码都在同一个项目中编译/链接:这里没有库......
谢谢大家的回答和评论。 该问题源于 Mac 上下文中错误的 uint32 类型定义。在某些条件 #if/#endif 标头部分中,它不是 unsigned int,而是 unsigned long。