我正在使用visual项目2019-和vcpkg来加载数据到CUDA 11.6 C++视频工作室项目。
在文件开始时,我有:
// #define H5_BUILT_AS_DYNAMIC_LIB
#include <H5Cpp.h>
而且它不会出现任何错误--所以我假设它是由vcpkg正确加载和集成的。同样,在post末尾可见的H5文件在解决方案资源管理器的外部依赖项列表中可见。
导致错误的简单代码如下所示
H5::H5File file(FILE_NAME, H5F_ACC_RDONLY);
H5::DataSet dset = file.openDataSet(DATASET_NAME);
错误(一组未解决的外部符号错误)-它出现在编译时。
如果我取消注释#定义H5_BUILT_AS_DYNAMIC_LIB 1,上面讨论的错误将消失,但是新的显示(在运行时)-
hdf5_cpp_D.dll not found ...
在我的cmake C++项目中,完全相同的代码工作得很好,但出于各种原因,我需要切换到visual项目。
最小示例给出误差
#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命令
.\vcpkg install hdf5
.\vcpkg install hdf5[cpp]
.\vcpkg integrate install
发布于 2022-02-25 18:50:09
在我的情况下,解决方案很简单,只需重新安装windows --在新安装时,我执行了一些步骤,就像开始时提到的,现在所有的工作都开始了。
发布于 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.dll
和hdf5_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。
https://stackoverflow.com/questions/71262437
复制相似问题