首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >通过vcpkg将HDF5库加载到C++ vscode项目时未解析的外部符号

通过vcpkg将HDF5库加载到C++ vscode项目时未解析的外部符号
EN

Stack Overflow用户
提问于 2022-02-25 07:28:32
回答 2查看 285关注 0票数 0

我正在使用visual项目2019-和vcpkg来加载数据到CUDA 11.6 C++视频工作室项目。

在文件开始时,我有:

代码语言:javascript
代码运行次数:0
运行
复制
// #define H5_BUILT_AS_DYNAMIC_LIB 
#include <H5Cpp.h>

而且它不会出现任何错误--所以我假设它是由vcpkg正确加载和集成的。同样,在post末尾可见的H5文件在解决方案资源管理器的外部依赖项列表中可见。

导致错误的简单代码如下所示

代码语言:javascript
代码运行次数:0
运行
复制
    H5::H5File file(FILE_NAME, H5F_ACC_RDONLY);
    H5::DataSet dset = file.openDataSet(DATASET_NAME);

错误(一组未解决的外部符号错误)-它出现在编译时。

如果我取消注释#定义H5_BUILT_AS_DYNAMIC_LIB 1,上面讨论的错误将消失,但是新的显示(在运行时)-

代码语言:javascript
代码运行次数:0
运行
复制
hdf5_cpp_D.dll not found ...

在我的cmake C++项目中,完全相同的代码工作得很好,但出于各种原因,我需要切换到visual项目。

最小示例给出误差

代码语言:javascript
代码运行次数:0
运行
复制
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
//#define H5_BUILT_AS_DYNAMIC_LIB 1
#include <H5Cpp.h>
#include <stdio.h>





void loadHDFIntoBoolArr(H5std_string FILE_NAME, H5std_string DATASET_NAME, bool*& data) {


    H5::H5File file(FILE_NAME, H5F_ACC_RDONLY);
    H5::DataSet dset = file.openDataSet(DATASET_NAME);
    /*
     * Get the class of the datatype that is used by the dataset.
     */
    H5T_class_t type_class = dset.getTypeClass();
    H5::DataSpace dspace = dset.getSpace();
    int rank = dspace.getSimpleExtentNdims();


    hsize_t dims[2];
    rank = dspace.getSimpleExtentDims(dims, NULL); // rank = 1
    printf("Datasize: %d \n ", dims[0]); // this is the correct number of values

     // Define the memory dataspace
    hsize_t dimsm[1];
    dimsm[0] = dims[0];
    H5::DataSpace memspace(1, dimsm);

    data = (bool*)calloc(dims[0], sizeof(bool));

    dset.read(data, H5::PredType::NATIVE_HBOOL, memspace, dspace);

    file.close();

}

void loadHDF() {
    const int WIDTH = 512;
    const int HEIGHT = 512;
    const int DEPTH = 826;


    const H5std_string FILE_NAMEonlyLungsBoolFlat("C:\\Users\\1\\PycharmProjects\\pythonProject3\\mytestfile.hdf5");
    const H5std_string DATASET_NAMEonlyLungsBoolFlat("onlyLungsBoolFlat");
    // create a vector the same size as the dataset
    bool* onlyLungsBoolFlat;
    loadHDFIntoBoolArr(FILE_NAMEonlyLungsBoolFlat, DATASET_NAMEonlyLungsBoolFlat, onlyLungsBoolFlat);

  

}


int main()
{
    loadHDF();
    return 0;
}

使用vcpk命令

代码语言:javascript
代码运行次数:0
运行
复制
.\vcpkg install hdf5
.\vcpkg install hdf5[cpp]
.\vcpkg integrate install

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-02-25 18:50:09

在我的情况下,解决方案很简单,只需重新安装windows --在新安装时,我执行了一些步骤,就像开始时提到的,现在所有的工作都开始了。

票数 1
EN

Stack Overflow用户

发布于 2022-02-25 17:58:18

如果您用H5_BUILT_AS_DYNAMIC_LIB 1定义的方法构建这个文件,那么hdf5_cpp_D.dll就应该位于vcpkg_installed目录下的某个位置。查看$(vcpkg_root)\installed\并搜索一个hdf5目录。应该有一个.\bin和一个带有hdf5_cpp.dllhdf5_cpp_D.dll.\debug\bin目录。(我猜_D是用于调试的)。

通常,vcpkg integrate install将设置Visual,以便将vcpkg目录中的dll自动复制到输出目录中。但是,如果在运行时动态加载hdf5 DLL,则可能会失败。您必须手动复制它(或者将路径添加到path环境变量)。

如果没有定义H5_BUILT_AS_DYNAMIC_LIB 1,则应该在静态库(hdf5.lib)中定义符号。在$(vcpkg)\installed目录中搜索它们。应该有两个(或四个)不同的版本,一个用于发布,一个用于调试(每个用于静态和动态链接库)。

哦,我忘了:你用的是哪一种三胞胎?这也可能会起到将hdf5.lib链接到其中的作用。

如果您仍然得到链接器错误(未定义的符号),那么hdf5的vcpkg端口可能不适用于静态链接。你应该开一张票,然后用hdf5。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71262437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档