Cocos2d-x version: cocos2d-x-3.16
sdkbox version: v1.0.2.0
xcode version: 10.0 (10A255)
I’m having trouble compiling my project after installing iap via sdkbox import iap
I get the following error:
linker command failed with exit code 1
I’ve tried to manually delete the iap frameworks from my project and reinstalling them but no luck.
I’ve tried downloading an older version of xcode: 9.4.1 but that did not help.
I am also using the sdkbox admob and that is working.
Error log:
Undefined symbols for architecture arm64:
"sdkbox::IAPListener::onRestored(sdkbox::Product const&)", referenced from:
IAPManager::onRestored(sdkbox::Product const&) in IAPManager.o
"sdkbox::IAPListener::onProductRequestFailure(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from:
IAPManager::onProductRequestFailure(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in IAPManager.o
"sdkbox::IAPListener::onSuccess(sdkbox::Product const&)", referenced from:
IAPManager::onSuccess(sdkbox::Product const&) in IAPManager.o
"sdkbox::IAPListener::onCanceled(sdkbox::Product const&)", referenced from:
IAPManager::onCanceled(sdkbox::Product const&) in IAPManager.o
"sdkbox::IAPListener::onFailure(sdkbox::Product const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from:
IAPManager::onFailure(sdkbox::Product const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in IAPManager.o
"sdkbox::IAPListener::onProductRequestSuccess(std::__1::vector<sdkbox::Product, std::__1::allocator<sdkbox::Product> > const&)", referenced from:
IAPManager::onProductRequestSuccess(std::__1::vector<sdkbox::Product, std::__1::allocator<sdkbox::Product> > const&) in IAPManager.o
"sdkbox::IAPListener::onInitialized(bool)", referenced from:
IAPManager::onInitialized(bool) in IAPManager.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Got it to compile. I was trying to call the base functions in my sdkbox::IAPListener derrived class.
I created a manager to wrap the framework and handle the purchases. After commenting out calling the base, it compiles.
BROKEN Version
//Init the current isntance if this singleton to NULL
IAPManager* gSingletonInstance_iapManager = NULL;
IAPManager* IAPManager::getInstance()
{
if(gSingletonInstance_iapManager == NULL)
{
gSingletonInstance_iapManager = new IAPManager();
}
return gSingletonInstance_iapManager;
}
IAPManager::IAPManager()
{
}
IAPManager::~IAPManager()
{
}
void IAPManager::initializeIAP()
{
sdkbox::IAP::setListener(this);
sdkbox::IAP::init();
}
/////////////////////////
//Admob listener events
/////////////////////////
void IAPManager::onInitialized(bool ok)
{
sdkbox::IAPListener::onInitialized(ok);
}
void IAPManager::onSuccess(sdkbox::Product const& p)
{
sdkbox::IAPListener::onSuccess(p);
}
void IAPManager::onFailure(sdkbox::Product const& p, const std::string &msg)
{
sdkbox::IAPListener::onFailure(p, msg);
}
void IAPManager::onCanceled(sdkbox::Product const& p)
{
sdkbox::IAPListener::onCanceled(p);
}
void IAPManager::onRestored(sdkbox::Product const& p)
{
sdkbox::IAPListener::onRestored(p);
}
void IAPManager::onProductRequestSuccess(std::vector<sdkbox::Product> const &products)
{
sdkbox::IAPListener::onProductRequestSuccess(products);
}
void IAPManager::onProductRequestFailure(const std::string &msg)
{
sdkbox::IAPListener::onProductRequestFailure(msg);
}
void IAPManager::onRestoreComplete(bool ok, const std::string &msg)
{
sdkbox::IAPListener::onRestoreComplete(ok, msg);
}
COMPILING Version
IAPManager* gSingletonInstance_iapManager = NULL;
IAPManager* IAPManager::getInstance()
{
if(gSingletonInstance_iapManager == NULL)
{
gSingletonInstance_iapManager = new IAPManager();
}
return gSingletonInstance_iapManager;
}
IAPManager::IAPManager()
{
}
IAPManager::~IAPManager()
{
}
void IAPManager::initializeIAP()
{
sdkbox::IAP::setListener(this);
sdkbox::IAP::init();
}
/////////////////////////
//Admob listener events
/////////////////////////
void IAPManager::onInitialized(bool ok)
{
// REMOVED LINE
}
void IAPManager::onSuccess(sdkbox::Product const& p)
{
// REMOVED LINE
}
void IAPManager::onFailure(sdkbox::Product const& p, const std::string &msg)
{
// REMOVED LINE
}
void IAPManager::onCanceled(sdkbox::Product const& p)
{
// REMOVED LINE
}
void IAPManager::onRestored(sdkbox::Product const& p)
{
// REMOVED LINE
}
void IAPManager::onProductRequestSuccess(std::vector<sdkbox::Product> const &products)
{
// REMOVED LINE
}
void IAPManager::onProductRequestFailure(const std::string &msg)
{
// REMOVED LINE
}
void IAPManager::onRestoreComplete(bool ok, const std::string &msg)
{
// REMOVED LINE
}
It’s great you solve your issue.