c++ - 从 Objective-C 访问静态 C++ 字段

标签 c++ objective-c xcode7

我有一个 C++ 库并进行了修改,所以我想添加一个新的静态变量。

但我总是有同样的错误。

Ld /Users/ricardo/Library/Developer/Xcode/DerivedData/parlamobile-gjgrppzlpeaavrbixticgpbwnurz/Build/Products/Debug-iphoneos/myapp.app/myapp normal arm64
    cd /Users/ricardo/xcode/mobile-ios
    export IPHONEOS_DEPLOYMENT_TARGET=8.0
    export PATH="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -arch arm64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk -L/Users/ricardo/Library/Developer/Xcode/DerivedData/parlamobile-gjgrppzlpeaavrbixticgpbwnurz/Build/Products/Debug-iphoneos -L/Users/ricardo/xcode/mobile-ios/parlamobile/Vendor/OpenSSL/lib -F/Users/ricardo/Library/Developer/Xcode/DerivedData/parlamobile-gjgrppzlpeaavrbixticgpbwnurz/Build/Products/Debug-iphoneos -F/Users/ricardo/xcode/mobile-ios/Pods/Crashlytics/iOS -F/Users/ricardo/xcode/mobile-ios/Pods/Fabric/iOS -F/Users/ricardo/xcode/mobile-ios -F/Users/ricardo/xcode/mobile-ios/parlamobile/Frameworks -filelist /Users/ricardo/Library/Developer/Xcode/DerivedData/parlamobile-gjgrppzlpeaavrbixticgpbwnurz/Build/Intermediates/parlamobile.build/Debug-iphoneos/myApp.build/Objects-normal/arm64/myApp.LinkFileList -Xlinker -rpath -Xlinker @executable_path/Frameworks -miphoneos-version-min=8.0 -dead_strip -Xlinker -no_deduplicate -ObjC -lc++ -lz -framework Crashlytics -framework Fabric -framework Security -framework SystemConfiguration -framework UIKit -fobjc-arc -fobjc-link-runtime -lsqlite3 -framework SystemConfiguration -framework CoreData -lz.1.2.5 -framework UIKit -framework Foundation -lssl -lcrypto -lPods-myApp -Xlinker -dependency_info -Xlinker /Users/ricardo/Library/Developer/Xcode/DerivedData/parlamobile-gjgrppzlpeaavrbixticgpbwnurz/Build/Intermediates/parlamobile.build/Debug-iphoneos/myApp.build/Objects-normal/arm64/myApp_dependency_info.dat -o /Users/ricardo/Library/Developer/Xcode/DerivedData/parlamobile-gjgrppzlpeaavrbixticgpbwnurz/Build/Products/Debug-iphoneos/myApp.app/myApp

ld: warning: directory not found for option '-F/Users/ricardo/xcode/mobile-ios/parlamobile/Frameworks'
Undefined symbols for architecture arm64:
  "DNS::ipType", referenced from:
      -[GlooxBridge getIPType] in GlooxBridge.o
     DNS::connect(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int, gloox::LogSink const&) in dns.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

这是我的 dns.h

#ifndef DNS_H__
#define DNS_H__

#include "macros.h"
#include "logsink.h"

#ifdef __MINGW32__
# include <windows.h>
# include <windns.h>
#endif

#ifdef HAVE_ARPA_NAMESER_H
# include <arpa/nameser.h>
#endif

#ifdef __APPLE__
# include <arpa/nameser_compat.h>
#endif

#ifndef NS_MAXDNAME
# define NS_MAXDNAME 1025
#endif

#ifndef NS_PACKETSZ
# define NS_PACKETSZ 512
#endif

#ifdef HAVE_GETADDRINFO
# include <sys/types.h>
# include <sys/socket.h>
# include <netdb.h>
#endif

#include <string>
#include <map>

namespace gloox
{

  /**
   * @brief This class holds a number of static functions used for DNS related stuff.
   *
   * You should not need to use these functions directly.
   *
   * @author Jakob Schröter <js@camaya.net>
   * @since 0.3
   */
  class GLOOX_API DNS
  {
    public:
      //IP type (4 or 6)
      static int ipType;//nothing(0),ipv4(4),ipv6(6)
      ...

这就是我访问 dns.cpp 中变量的方式

if(sockfd!=-1){
    DNS::ipType = 6;
}

现在来自 Objective-c 类 MyBridge.h

#import <Foundation/Foundation.h>
#import "RemoteDto.h"

@class MyUserDto;
@class MyMessageDto;
@class MyRoomDto;

@interface GlooxBridge : NSObject<RemoteDtoDelegate>

@property (nonatomic, readwrite) BOOL loggedIn;
@property (nonatomic, retain) NSMutableDictionary *contacts;
....

+ (GlooxBridge *)sharedInstance;

- (IBAction)initMainLoop;
- (IBAction)appearOnline;
- (IBAction)appearOffline;
- (IBAction)logout;
...

- (int)getIPType;

@end

MyBridge.mm

#import "GlooxBridge.h"
#include "GlooxHelper.h"
#include "gloox.h"
#include "dns.h"

using namespace gloox;

static GlooxBridge *_instance;
static GlooxHelper *_helper;

@implementation GlooxBridge {
    int _firstMessage;
    DataForm *_roomConfigForm;
    UIBackgroundTaskIdentifier _backgroundTaskId;
}

@synthesize loggedIn = _loggedIn;
@synthesize contacts = _contacts;
@synthesize rooms = _rooms;
@synthesize lastMessages = _lastMessages;
@synthesize roomParticipants = _roomParticipants;

+ (GlooxBridge *)sharedInstance {
    @synchronized(self) {
        if(!_instance) {
            _instance = [[GlooxBridge alloc] init];
        }
    }

    return _instance;
}

- (id)init {
    if (self = [super init]) {
        _loggedIn = NO;
    }

    return self;
}

...

- (int)getIPType {
    //return GLOOX_API::DNS::ipType;
    return DNS::ipType;
}

最佳答案

看起来你忘记了变量的定义。
(请注意,C++ 中 DNS::connect 的访问也是未定义的,这表明这不是 Objective-C++ 问题)。

添加

int DNS::ipType;

到文件范围内的“dns.cpp”。
(如果您不希望它为零,请使用合适的初始值。)

关于c++ - 从 Objective-C 访问静态 C++ 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38825517/

相关文章:

ios - 如果使用桥接头,Xcode 7 不会自动完成

C++11 元编程 - 在编译期间查找枚举值(值包含间隙)

c++ - 自动扣除失败并显示消息 "inconsistent deduction for auto return type"

ios - NSLog 默认断行

objective-c - NSButton 子类为 colorwell 并防止 NSColorPanel 接触第一响应者

uiview - Xcode 7 View "semantic" Storyboard设置是什么?

c++ - STL set_symmetric_difference 的时间复杂度

c++ - 使用 gdbserver 从 clion 调试 jni 库

objective-c - 如何让 xcode 8 对可为空的 block 指针发出警告?

swift - 如何获得房间内用户坐姿的准确经纬度值?