【问题标题】:Libs ,DLLs and .h files库、DLL 和 .h 文件
【发布时间】:2015-06-29 21:02:17
【问题描述】:

我是一个 C# 人,所以我在这里迷路了,这个项目声称已经为 Windows 编译了该库https://soildgeo.codeplex.com/releases/view/108738

该文件夹带有 Include、Lib64 和 Bin64 文件夹。如果我没记错的话,我只需要将 .lib 文件复制到 VC/lib 文件夹,并将 include 中的文件夹复制到 VC/include 文件夹,这样我就可以开始针对这些 API 进行编码,它们出现在 #include智能感知,但随后它们无法编译。我的问题是,我对整个过程的假设是否正确?如果不是正确的步骤是什么?最后,我是否需要随时使用 Bin64 文件夹中的 Dll?

我正在使用 VS2013 提前致谢

编辑

1>------ 构建开始:项目:PhysBAMTest,配置:Debug x64 ------ 1> 主.cpp 1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\PhysBAM_Tools\Log\LOG.h(163): 错误 C2146: 语法错误: 缺少';'在标识符“属性”之前 1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\PhysBAM_Tools\Log\LOG.h(163): 错误 C2530: 'PhysBAM::LOG::anonymous-namespace'::cout' : references must be initialized 1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\PhysBAM_Tools\Log\LOG.h(163): error C2065: 'unused' : undeclared identifier 1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\PhysBAM_Tools\Log\LOG.h(163): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\PhysBAM_Tools\Log\LOG.h(163): error C2143: syntax error : missing ';' before '=' 1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\PhysBAM_Tools\Log\LOG.h(164): error C2146: syntax error : missing ';' before identifier '__attribute__' 1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\PhysBAM_Tools\Log\LOG.h(164): error C2530: 'PhysBAM::LOG::anonymous-namespace':: cerr' : 必须初始化引用 1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\PhysBAM_Tools\Log\LOG.h(164): error C2065: 'unused' : undeclared identifier 1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\PhysBAM_Tools\Log\LOG.h(164):错误 C4430:缺少类型说明符 - 假定为 int。注意:C++ 不支持默认整数 1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\PhysBAM_Tools\Log\LOG.h(164): 错误 C2374: 'PhysBAM::LOG::anonymous-namespace'::__attribute__' : redefinition; multiple initialization 1> C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\PhysBAM_Tools\Log\LOG.h(163) : see declaration of 'PhysBAM::LOG::anonymous-namespace':: 属性' 1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\PhysBAM_Tools\Log\LOG.h(164): 错误 C2143: 语法错误: 缺少';'在'='之前 ========== 构建:0 成功,1 失败,0 最新,0 跳过 ==========

编辑

根据下面的答案添加WIN32宏后,这次我遇到了链接器错误

错误 1 ​​错误 LNK2019:未解析的外部符号“class std::basic_ostream > & __cdecl PhysBAM::LOG::cout_Helper(void)”(?cout_Helper@LOG@PhysBAM@@YAAEAV?$basic_ostream@DU?$char_traits@ D@std@@@std@@XZ) 在函数“void __cdecl PhysBAM::LOG::anonymous namespace'::dynamic initializer for 'cout''(void)”中引用 (??__Ecout@?A0x5bbeb782@LOG@PhysBAM@@ YAXXZ) C:\Users...\Documents\Visual Studio 2013\Projects\PhysBAMTest\PhysBAMTest\main.obj PhysBAMTest

【问题讨论】:

  • 一个建议:无论何时/无论何时添加新的.. 将它们分开.. 始终。永远不要弄乱现有的东西。始终添加新文件夹以包含路径。
  • 为了澄清一些事情,.lib 文件有两种类型:一种用于静态链接,其中.lib 文件包含库的实际代码;并导出库以充当 DLL 的包装器,其中 DLL 包含库的实际代码。头文件可以包含一些内联代码,但大部分只是告诉编译器库中存在什么的声明。

标签: c++ visual-c++


【解决方案1】:

所有这些attributeunused__attribute__ 都是一些人所说的 GNU-ishms,即特定于 GCC 兼容编译器(GCC 本身、Clang、ICC 等)的功能。但是 MS VC 的目标不是 GCC 兼容性,所以它们根本不起作用。

移植到 Windows 的人设法通过使用一些预编译器技巧删除了这些构造,我认为在文件 Utilities/PHYSBAM_OVERRIDE.h 中。但是为了让那些工作你必须定义宏WIN32。在项目“C/C++ 预处理器设置”页面中执行此操作,而不是在代码中执行此操作,因此它将同时为所有源文件定义。

或者,这个 IMO 将是正确的解决方案,修补源,并将每次出现的 #ifdef WIN32#if defined(WIN32) 替换为 #ifdef _WIN32。宏 _WIN32always predefined in Win32 and Win64,但 WIN32 不是。

好吧,从技术上讲,如果问题是关于作为 Windows 系统还是关于作为 MSVC 编译器(Windows 有一个 GCC 编译器),您必须区分每种情况。然后将_WIN32 用于系统依赖,_MSC_VER 用于编译器。

然后,如果您愿意,可以向 Codeplex 项目发送补丁。

更新

关于链接器错误,应该很容易修复:只需将必要的“*.lib”文件添加到项目中即可。您可以将它们添加到项目的Linker Property Page

【讨论】:

  • 感谢您的回复,我不确定我们是否在同一页面上,或者我是否很好地解释了问题,生成上述输出的代码只是一个新项目,我添加了一个#include 到库的 .h 文件之一。因为我认为这些库很好用。如果我理解您的帖子,我现在应该创建一个新项目,在其中添加库的源代码,并在添加 Win32 宏后尝试在我的机器上编译它?实际上我早先这样做了,但我有不同类型的错误和不同的输出
  • @Musaab:您应该在包含这些*.h 的任何项目中设置WIN32 宏(注意大写)。如果您遇到不同的错误,请也发布它们,我们将看到如何解决它们。如果您未能将必要的*.lib 文件添加到项目中,它们可能是链接器错误。
  • 正如你所说,我编辑了原始问题以包含链接器错误
【解决方案2】:

除了您对 .lib 和 .h 所做的操作之外,您还需要将 .dll 保存在 System32 目录中,或者保存在您拥有 exe 的同一目录中。

this question 的回答可能会帮助您更好地理解。

【讨论】:

  • 是的..如果编译器找不到.dll,程序将失败。
  • 我添加了上面的输出,我按照你的建议做了(包含在 System32、sysWOW64、可执行文件等中)但似乎没有任何结果
猜你喜欢
  • 1970-01-01
  • 2012-12-08
  • 2010-11-13
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 2022-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多