简体   繁体   中英

In VS2010 ,VC++ error LNK 2019 with CoolProp 5.0.0

I am an amateur VC++ developer.

I want to use CoolProp ( http://www.coolprop.org/ ) in my academic VC++ project as a static library in a win 32 app using a VS2010 Ultimate running in x64 laptop machine.

So i have downloaded ,

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

and placed both in a system folder.

Next i created a sample win32 console application in VS2010 as empty sln. Added CoolProp.h as an Additional Include Directories in Properties->C/C++->General(Also copied all the dependent header files) Added CoolProp.lib as an Additional Dependencies in Properties->Linker->Input->Additional Dependencies

Then i copied this program from 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;
}

and tried to build.

Build(but compiled perfectly) failed due to

main.obj : error LNK2019: unresolved external symbol "double __cdecl PropsSI(char,char,double,char,double,char *)" (?Props@@YANDDNDNPAD@Z) referenced in function _main

Can somebody please help me in resolving this ? I already read below posts from stackoverflow , but couldnt solve please help

It is working for me, (VS 2010) as following:
-add file 'CoolPropLib.h' to your project, by right click on header files folder in solution explorer -> Add -> Existing Item -> choose 'CoolPropLib.h'.
-open file 'CoolPropLib.h' and comment line 22 as follow (//#include "PlatformDetermination.h").
- add these two lines (23, 24) :

 #define CONVENTION __stdcall
 #define EXTERNC


-use library that is built with __stcall not that built with __cdecel :
http://sourceforge.net/projects/coolprop/files/CoolProp/5.0.0/shared_library/Windows/32bit__stdcall_calling_convention/CoolProp.lib/download
-you will need the dll (for __stdcall) from :
http://sourceforge.net/projects/coolprop/files/CoolProp/5.0.0/shared_library/Windows/32bit__stdcall_calling_convention/CoolProp.dll/download

-create folder named 'lib' in your project folder in windows explorer (not in VS) and put 'CoolProp.lib' in it.

-in Properties->Linker->General-> Additional libraries Directories, add $(ProjectDir)\\lib
-the code I test is:

#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;
}

-if you have problems, I can upload the project to you.


EDIT 1:

  • I mean 'CoolPropLib.h' not 'CoolProp.h', I correct it; In your question, you named it as 'CoolProp.h'.
  • As you mentioned in your comment; you can change calling convention as _stdcall in Properties->c/c++ ->Advanced .

I am one of the the primary developers for CoolProp. Thank you @houssam for your helpful reply. The problem with going the DLL (shared library) route is that you lose access to a lot of useful low-level functions, whereas if you link with the static library, you still have access to all the low-level code

The better plan is to build the static library yourself, as it is required that the compiler that is used to build the static library is EXACTLY the same as the compiler used to compile your project. In order to do that, you can follow the directions here: http://www.coolprop.dreamhosters.com:8010/sphinx/coolprop/wrappers/StaticLibrary/index.html#static-library , basically you need to do

# 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 .

You then need to link the static library as described by @houssam. No other changes should be required to your code.

In the future, the coolprop-users@googlegroups.com mailing list or https://github.com/CoolProp/CoolProp/issues are good places to ask questions.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM