2016-08-08 47 views
0

Ich habe eine Bibliothek in C++ und habe Änderungen vorgenommen, also möchte ich eine neue statische Variable hinzufügen.Zugriff auf ein statisches C++ Feld von objective-c

Aber ich habe immer den gleichen Fehler.

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) 

Das ist mein 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 <[email protected]> 
    * @since 0.3 
    */ 
    class GLOOX_API DNS 
    { 
    public: 
     //IP type (4 or 6) 
     static int ipType;//nothing(0),ipv4(4),ipv6(6) 
     ... 

Dies ist, wie ich auf die Variable in dns.cpp Zugriff

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

Und jetzt von Objective-C-Klasse 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; 
} 

Antwort

2

Sieht so aus, als hätten Sie die Definition der Variablen vergessen.
(Beachten Sie, dass der Zugriff von DNS::connect in C++ auch nicht definiert ist, was darauf hindeutet, dass es sich nicht um ein Objective-C++ - Problem handelt).

int DNS::ipType; 

auf "dns.cpp" im Dateigültigkeitsbereich hinzufügen.
(Mit einem geeigneten Anfangswert, wenn Sie nicht wollen, dass es Null ist.)