在VS2010中,VC ++错误LNK 2019与CoolProp 5.0.0

时间:2014-12-07 07:07:31

标签: visual-studio-2010 visual-c++ lnk2019

我是业余VC ++开发人员。

我想在我的学术VC ++项目中使用 CoolProp http://www.coolprop.org/)作为win 32应用程序中的静态库,使用在x64笔记本电脑上运行的VS2010 Ultimate。

所以我已经下载了,

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

并将它们放在系统文件夹中。

接下来,我在VS2010中创建了一个示例win32控制台应用程序,作为空sln。 添加了CoolProp.h作为属性中的附加包含目录 - > C / C ++ - > General(还复制了所有相关头文件) 添加了CoolProp.lib作为属性中的附加依赖项 - >链接器 - >输入 - >附加依赖项

然后我从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;
}

并试图建立。

由于

构建(但编译完美)失败

main.obj:错误LNK2019:未解析的外部符号&#34; double __cdecl PropsSI(char,char,double,char,double,char *)&#34; (?Props @@ YANDDNDNPAD @ Z)在函数_main

中引用

有人可以帮我解决这个问题吗? 我已经阅读了stackoverflow的以下帖子,但是无法解决请帮助

2 个答案:

答案 0 :(得分:3)

它对我有用,(VS 2010)如下:
-add文件'CoolPropLib.h'到您的项目,右键单击解决方案资源管理器中的头文件文件夹 - &gt;添加 - &gt;现有项目 - &gt;选择'CoolPropLib.h'。
-open文件'CoolPropLib.h'和注释第22行如下(//#include“PlatformDetermination.h”)。
- 添加这两行(23,24):

 #define CONVENTION __stdcall
 #define EXTERNC


- 使用 __ stcall 构建的库不是使用 __ cdecel 构建的:
http://sourceforge.net/projects/coolprop/files/CoolProp/5.0.0/shared_library/Windows/32bit__stdcall_calling_convention/CoolProp.lib/download
你将需要来自:http://sourceforge.net/projects/coolprop/files/CoolProp/5.0.0/shared_library/Windows/32bit__stdcall_calling_convention/CoolProp.dll/download的dll(对于__stdcall)

- 在Windows资源管理器(不在VS中)的项目文件夹中创建名为“lib”的文件夹,并在其中放入“CoolProp.lib”。

-in Properties-&gt; Linker-&gt; General-&gt;其他库目录,添加 $(ProjectDir)\ lib
- 我测试的代码是:

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

- 如果您有问题,我可以将项目上传给您。


编辑1:

  • 我的意思是'CoolPropLib.h'而不是'CoolProp.h',我更正了;在您的问题中,您将其命名为“CoolProp.h”。
  • 正如你在评论中提到的那样;您可以在属性 - > c / c ++ - &gt;高级中将调用约定更改为_stdcall。

答案 1 :(得分: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的描述链接静态库。您的代码不需要进行任何其他更改。

将来,coolprop-users@googlegroups.com邮件列表或https://github.com/CoolProp/CoolProp/issues是提问的好地方。