2014-12-07 7 views
3

Я - любительский разработчик VC++.В VS2010 ошибка VC++ LNK 2019 с CoolProp 5.0.0

Я хочу использовать CoolProp (http://www.coolprop.org/) в моем учебном проекте VC++ в качестве статической библиотеки в Win 32 приложения с помощью VS2010 Окончательные работают в x64 ноутбуке машине.

Так я скачал,

1.CoolProp.lib из http://sourceforge.net/projects/coolprop/files/CoolProp/5.0.2/static_library/ 2.CoolProp.h из http://sourceforge.net/projects/coolprop/files/CoolProp/5.0.0/shared_library/

и размещены как в системной папке.

Затем я создал образец консольного приложения win32 в VS2010 как пустой sln. Добавил CoolProp.h в качестве дополнительных каталогов в свойствах -> C/C++ -> Общие (также скопировал все зависимые файлы заголовков) Добавил CoolProp.lib в качестве дополнительных зависимостей в свойствах-> Linker-> Input-> Additional Dependencies

Затем я скопировал эту программу из http://www.coolprop.org/coolprop/HighLevelAPI.html#high-level-api

#include "CoolProp.h" 
#include <iostream> 
using namespace CoolProp; 
int main() 
{ 
// First type (slowest, due to most string processing, exposed in DLL) 
std::cout << PropsSI("Dmolar","T",298,"P",1e5,"Propane[0.5]&Ethane[0.5]") << std::endl; //  Default backend is HEOS 
std::cout << PropsSI("Dmolar","T",298,"P",1e5,"HEOS::Propane[0.5]&Ethane[0.5]") << std::endl; 
std::cout << PropsSI("Dmolar","T",298,"P",1e5,"REFPROP::Propane[0.5]&Ethane[0.5]") << std::endl; 

std::vector<double> z(2,0.5); 
// Second type (C++ only, a bit faster) 
std::cout << PropsSI("Dmolar","T",298,"P",1e5,"Propane&Ethane", z) << std::endl; 
std::cout << PropsSI("Dmolar","T",298,"P",1e5,"HEOS::Propane&Ethane", z) << std::endl; 
std::cout << PropsSI("Dmolar","T",298,"P",1e5,"REFPROP::Propane&Ethane", z) << std::endl; 

return EXIT_SUCCESS; 
} 

и пытался построить.

Build (но компилируется отлично) не удалось из-за

main.obj: LNK2019 ошибка: неразрешенный внешний символ "двойной __cdecl PropsSI (символ, символ, двойной, символ, двойной, символ *)" (Принадлежит @@ YANDDNDNPAD @ Z) ссылка на функцию _main

Может кто-нибудь, пожалуйста, помогите мне в решении этого вопроса? я уже читал ниже посты от StackOverflow, но не смог решить, пожалуйста, помогите

ответ

3

Это работает для меня (VS 2010) следующим образом:
-add файл 'CoolPropLib.h' в ваш проект, щелкнув правой кнопкой мыши по папке файлов заголовков в проводнике решений -> Добавить -> Exis ting Item -> выберите «CoolPropLib.h».
-open файл 'CoolPropLib.h' и строка комментариев 22, как следует (// # include "PlatformDetermination.h").
- добавьте эти две линии (23, 24):

#define CONVENTION __stdcall 
#define EXTERNC 


-use библиотека, которая построена с __stcall не то, что построенный с __cdecel:
http://sourceforge.net/projects/coolprop/files/CoolProp/5.0.0/shared_library/Windows/32bit__stdcall_calling_convention/CoolProp.lib/download
-вы будет нуждаться в DLL (для __stdcall) от:
http://sourceforge.net/projects/coolprop/files/CoolProp/5.0.0/shared_library/Windows/32bit__stdcall_calling_convention/CoolProp.dll/download

-создайте папку с именем «lib» в папке проекта в проводнике Windows (не в VS) и установите «CoolProp.lib» в нем.

-in Properties-> Linker-> общ-> Дополнительные библиотеки Каталоги, добавьте $ (ProjectDir) \ Lib
-The тестовый код I является:

#include "stdafx.h" 
#include <iostream> 
#include <vector> 
#include "CoolPropLib.h" 
using namespace std; 


int _tmain(int argc, _TCHAR* argv[]) 
{ 

    // First type (slowest, due to most string processing, exposed in DLL) 
    std::cout << PropsSI("Dmolar","T",298,"P",1e5,"Propane[0.5]&Ethane[0.5]") << std::endl; //  Default backend is HEOS 
    std::cout << PropsSI("Dmolar","T",298,"P",1e5,"HEOS::Propane[0.5]&Ethane[0.5]") << std::endl; 
    std::cout << PropsSI("Dmolar","T",298,"P",1e5,"REFPROP::Propane[0.5]&Ethane[0.5]") << std::endl; 

    return 0; 
} 

-если у вас есть проблемы, Я могу загрузить проект вам.


EDIT 1:

  • Я имею в виду 'CoolPropLib.h' не 'CoolProp.h', я это исправить; В вашем вопросе вы назвали его «CoolProp.h».
  • Как вы упомянули в своем комментарии; вы можете изменить соглашение о вызовах как _stdcall в Properties-> c/C++ -> Advanced.
+0

Это сработало для меня. i включил CoolPropLib.h и изменил соглашение о вызовах как _stdcall в свойствах-> c/C++ -> Дополнительно. Большое вам спасибо – Selva

+0

@SelvaKumar: добро пожаловать. Я изменил ответ. – houssam

+0

Как я упоминал в своем ответе, использование DLL не оптимально, потому что вы ограничены в функциональности, которую вы можете использовать. Лучше строить статическую библиотеку самостоятельно, как я описываю. – ibell

3

Я являюсь одним из основных разработчиков для CoolProp. Спасибо @houssam за ваш ответ. Проблема с маршрутом DLL (разделяемая библиотека) заключается в том, что вы теряете доступ к множеству полезных низкоуровневых функций, тогда как если вы связываетесь со статической библиотекой, у вас все еще есть доступ ко всему низкоуровневому коду

Лучшим планом является создание статической библиотеки самостоятельно, так как требуется, чтобы компилятор, который используется для сборки статической библиотеки, ТОЧНО так же, как и компилятор, используемый для компиляции вашего проекта. Для того, чтобы сделать это, вы можете следовать инструкциям здесь: http://www.coolprop.dreamhosters.com:8010/sphinx/coolprop/wrappers/StaticLibrary/index.html#static-library, в основном вам нужно сделать

# Check out the sources for CoolProp 
git clone https://github.com/CoolProp/CoolProp --recursive 
# Move into the folder you just created 
cd CoolProp 
# Make a build folder 
mkdir build && cd build 
# Build the makefile using CMake 
cmake .. -DCOOLPROP_STATIC_LIBRARY=ON -G "Visual Studio 10 2010" 
# Make the static library 
cmake --build . 

Затем нужно связать статическую библиотеку, как описано @houssam. Никакие другие изменения не требуются для вашего кода.

В будущем список рассылки [email protected] или https://github.com/CoolProp/CoolProp/issues - это хорошие места, чтобы задавать вопросы.

+0

Спасибо Ян Белл :) – Selva

+0

Спасибо, Белл. – houssam