Привет, я хочу вызывать функции из C dll в C ++ / CLI.Функции C объявлены extern.Я следовал этому руководству для связывания DLL: http://social.msdn.microsoft.com/Forums/en/Vsexpressvc/thread/84deabaa-ae82-47cc-aac0-592f5a8dfa22, а затем в моей C ++ / CLI DLL у меня есть следующее:
// testWrapper.h
#pragma once
using namespace System;
namespace testWrapper {
extern "C" int GtoCalcImpliedVolatility2(
double premium,
int optionType,
double underPrice,
double strike,
double yearsToExpiry,
double yearsToPayment,
double volGuess,
double discountRate,
double dividendRate,
double growthRate,
double *impliedVol);
public ref class MyNamesSplitterClass
{
private:
public:
int TestSomething()
{
double vol;
int _status = GtoCalcImpliedVolatility2(
0.098328, //premium
'P', //optionType
0.950000, //underPrice
1.050000, //strike
0.900000, //yearsToExpiry
0.95, //yearsToPayment
0.01, //volGuess
0.02, //discountRate
0.03, //dividendRate
0.04,//growthRate
&vol);
}
};
}
Я знаю, что я должен давать только подписи в.h, а затем написать код функции в .cpp, но для тестирования я пишу его там же.Вот ошибки, которые я получаю:
Error 3 error LNK1120: 2 unresolved externals (etc...)
Error 1 error LNK2028: unresolved token (0A000006) "int __cdecl testWrapper::GtoCalcImpliedVolatility2(double,int,double,double,double,double,double,double,double,double,double *)" (?GtoCalcImpliedVolatility2@testWrapper@@$$FYAHNHNNNNNNNNPAN@Z) referenced in function "public: int __clrcall testWrapper::MyNamesSplitterClass::TestSomething(void)" (?TestSomething@MyNamesSplitterClass@testWrapper@@$$FQ$AAMHXZ)
Error 2 error LNK2019: unresolved external symbol "int __cdecl testWrapper::GtoCalcImpliedVolatility2(double,int,double,double,double,double,double,double,double,double,double *)" (?GtoCalcImpliedVolatility2@testWrapper@@$$FYAHNHNNNNNNNNPAN@Z) referenced in function "public: int __clrcall testWrapper::MyNamesSplitterClass::TestSomething(void)" (?TestSomething@MyNamesSplitterClass@testWrapper@@$$FQ$AAMHXZ)
Я пытался найти их, но не могу найти много информации о них, кроме того факта, что они из-за плохой связи ...
ОБНОВЛЕНИЕ: Организация проектов ...
Итак, для моего проекта на c ++ / cli я написал .hpp следующим образом, который включает мои заголовки 880+:
extern "C" {
#include "accrued.h"
...
#include "gtobf.h" // this contains GtoCalcImpliedVolatility2
...
#include "../includep/zcsmthp.h"
}
следующее - это gtobf.h:
#ifndef ALIB_GTOBF_H
#define ALIB_GTOBF_H
#include "cgeneral.h"
#include "optprop.h" /* TOptionProperties */
#include "cmemory.h" /* FREE macro */
#include "rtnewton.h" /* TObjectFunc */
#ifdef __cplusplus
extern "C"
{
#endif
/*f
* Calculates volatility implied by the price of a given option.
*/
//#define GTO_EXPORT(type) __declspec(dllexport) type
GTO_EXPORT(int ) GtoCalcImpliedVolatility2(
double premium, /* (I) Option premium */
int optionType, /* (I) GtoOPTION_PUT/GtoOPTION_CALL */
double underPrice, /* (I) Underlyer price */
double strike, /* (I) Strike/exercise price */
double yearsToExpiry, /* (I) Years to option's expiry */
double yearsToPayment, /* (I) Years till option pays off */
double volGuess, /* (I) Volatility guess (.06 for 6%) */
double discountRate, /* (I) Discount rate (ann. compound) */
double dividendRate, /* (I) Dividend rate (ann. compound) */
double growthRate, /* (I) Growth rate (ann. compound) */
double *impliedVol); /* (O) Implied Volatility */
//...other functions
#ifdef __cplusplus
}
#endif
#endif /* ALIB_GTOBF_H */
Затем в свою оболочку c ++ / cli я включаю свой all.hpp, который включает в себя все остальные заголовки ... Со всем этим я все еще получаю ошибки.
Я уверен, что функция экспортируется, потому что я использовал dll из C #, используя P / Invoke ...
!!!!!!!!!!!!!!!РЕДАКТИРОВАТЬ:
Я не указал правильный путь для библиотеки ... Теперь я разобрался с этим, и я получаю ошибку LNK1104 о том, что он не может открыть мой .lib