Вызов собственного C, скомпилированного с VS 2005 из C ++ / CLI Visual studio 2010 - Не удается открыть файл .lib ... - PullRequest
0 голосов
/ 15 сентября 2011

Привет, я хочу вызывать функции из 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

Ответы [ 2 ]

1 голос
/ 15 сентября 2011

Где реализована функция C GtoCalcImpliedVolatility2? Если это отдельный файл .c или .cpp, добавьте этот файл в проект. Если он помещен в Dll, добавьте файл .lib к зависимостям компоновщика проекта.

Некоторые подробности: откройте Проект - Свойства - Свойства конфигурации - Компоновщик. Все .lib имя файла в списке дополнительных зависимостей. Убедитесь, что файл .lib можно найти, указав полный путь или добавив каталог .lib в список поиска компоновщика.

Редактировать. Linker - General - Дополнительные каталоги библиотек. Здесь вы можете добавить .lib путь к файлу для текущего проекта. Существует также список глобальных каталогов в разделе Инструменты - Параметры - Проект и решения - Каталоги VC ++ - Файлы библиотеки.

0 голосов
/ 16 сентября 2011

Решение:

В проекте C ++:

  • В C / C ++ -> General добавить каталог, содержащий заголовки, для включения
  • В компоновщике ->Общие Добавьте каталог файла .lib
  • В компоновщике -> Ввод -> Дополнительные зависимости добавьте имя файла .lib

И, наконец, в своем коде C ++ яне нужно переопределять функцию C.Ниже показан мой код:

.cpp: // Это основной файл DLL.

#include "stdafx.h"

#include "FinLib.h"

namespace FinLib {

    void Class1::CalcImpliedVolatility()
      {
          double volat = 0.0;
          int _status = GtoCalcImpliedVolatility2(//defined in all.h(dll)
                                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
                                 &volat);
          Console::WriteLine(volat);
      }
}

.h:

// FinLib.h

#pragma once
#include "all.hpp" //this line I will move to stdafx.h after (includes all the headers)
using namespace System;

namespace FinLib {

    public ref class Class1
    {
    public:

      void CalcImpliedVolatility();

    };
}
...