Issue
The question has been updated sinces its original posting. I have kept everything for context and information for people in the future, but the latest information and issues are at the bottom.
I have found somewhat similar questions posted previously about related subjects, but none of them seemed to have a clear, concise resolution for what exactly I'm doing. I'm hoping that by asking this question, I can get an answer and there will also be a more clear answer available on the internet for future people with similar troubles.
I am trying to create a simple example C++ code using NetCDF in Visual Studio 2019 with CMake as the build system. I installed NetCDF using vcpkg
, specifically the command
vcpkg install netcdf-cxx:x64-windows
which installed all prerequisite packages and netcdf-cxx:x64-windows to C:\Program Files\vcpkg\packages
.
In the project itself, I have two main files: main.cpp
and CMakeLists.txt
. The directory structure is as follows:
- C:\
- Users\
- Owner\
- Education and Research\
- Personal Projects\
- learning_coding\
- C++\
- cmake_netcdf\
- CMakeLists.txt
- main.cpp
The file main.cpp
is
#include <iostream>
#include <netcdf>
int main()
{
std::cout << "Hello world!" << std::endl;
return 0;
}
while CMakeLists.txt
is
cmake_minimum_required (VERSION 3.17)
project(cmake_netcdf)
# Add source to this project's executable.
add_executable(cmake_netcdf main.cpp)
# Find and include the netcdf package
find_package(netcdf CONFIG REQUIRED)
target_link_libraries(cmake_netcdf
PRIVATE netcdf
)
Visual Studio can successfully refresh C++ IntelliSense information,
1> CMake generation started for configuration: 'x64-Debug'.
1> Found and using vcpkg toolchain file (C:/Program Files/vcpkg/scripts/buildsystems/vcpkg.cmake).
1> The toolchain file has changed (CMAKE_TOOLCHAIN_FILE).
1> Command line: "cmd.exe" /c ""C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2019\COMMUNITY\COMMON7\IDE\COMMONEXTENSIONS\MICROSOFT\CMAKE\CMake\bin\cmake.exe" -G "Ninja" -DCMAKE_BUILD_TYPE:STRING="Debug" -DCMAKE_INSTALL_PREFIX:PATH="C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\out\install\x64-Debug" -DCMAKE_C_COMPILER:FILEPATH="C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.27.29110/bin/Hostx64/x64/cl.exe" -DCMAKE_CXX_COMPILER:FILEPATH="C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.27.29110/bin/Hostx64/x64/cl.exe" -DCMAKE_MAKE_PROGRAM="C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO\2019\COMMUNITY\COMMON7\IDE\COMMONEXTENSIONS\MICROSOFT\CMAKE\Ninja\ninja.exe" -DCMAKE_TOOLCHAIN_FILE="C:/Program Files/vcpkg/scripts/buildsystems/vcpkg.cmake" "C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf" 2>&1"
1> Working directory: C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\build\x64-Debug
1> [CMake] -- The C compiler identification is MSVC 19.27.29111.0
1> [CMake] -- The CXX compiler identification is MSVC 19.27.29111.0
1> [CMake] -- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.27.29110/bin/Hostx64/x64/cl.exe
1> [CMake] -- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.27.29110/bin/Hostx64/x64/cl.exe - works
1> [CMake] -- Detecting C compiler ABI info
1> [CMake] -- Detecting C compiler ABI info - done
1> [CMake] -- Detecting C compile features
1> [CMake] -- Detecting C compile features - done
1> [CMake] -- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.27.29110/bin/Hostx64/x64/cl.exe
1> [CMake] -- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.27.29110/bin/Hostx64/x64/cl.exe - works
1> [CMake] -- Detecting CXX compiler ABI info
1> [CMake] -- Detecting CXX compiler ABI info - done
1> [CMake] -- Detecting CXX compile features
1> [CMake] -- Detecting CXX compile features - done
1> [CMake] -- Found ZLIB: optimized;C:/Program Files/vcpkg/installed/x64-windows/lib/zlib.lib;debug;C:/Program Files/vcpkg/installed/x64-windows/debug/lib/zlibd.lib (found version "1.2.11")
1> [CMake] -- Found ZLIB: optimized;C:/Program Files/vcpkg/installed/x64-windows/lib/zlib.lib;debug;C:/Program Files/vcpkg/installed/x64-windows/debug/lib/zlibd.lib (found suitable version "1.2.11", minimum required is "1")
1> [CMake] -- Configuring done
1> [CMake] -- Generating done
1> [CMake] -- Build files have been written to: C:/Users/Owner/Education and Research/Personal Projects/learning_coding/C++/cmake_netcdf/build/x64-Debug
1> Extracted CMake variables.
1> Extracted source files and headers.
1> Extracted code model.
1> Extracted includes paths.
1> CMake generation finished.
but the project fails to build and gives the error messages cannot open source file "netcdf"
and Cannot open include file: 'netcdf': No such file or directory
. How can I fix this error?
EDIT 1: Following up on the comments:
- "Can you check in the Solution Properties->Include Directories whether the path to the netcdf include is set?" – user3389943
This code isn't saved as a solution, but you did prompt me to look at the CMake variables. The directory variable for netcdf is netcdf_DIR = C:/Program Files/vcpkg/installed/x64-windows/share/netcdf-c
, which looks like
- C:/Program Files/vcpkg/installed/x64-windows/share/netcdf-c/
- copyright
- netCDFConfig.cmake
- netCDFConfigVersion.cmake
- netCDFTargets.cmake
- netCDFTargets-debug.cmake
- netCDFTargets-release.cmake
- usage
- vcpkg_abi_info.txt
There is not variable for netcdf_INCLUDES
or anything of that sort. Is it an issue that it's looking at netcdf-c for a C++ program? How do I get CMake to look for the proper include directories?
- "There is no header named netcdf in the NetCDF package. It should read #include "netcdf.h"." – vre
Making that change does not fix the error, it gives the same error replacing 'netcdf'
with "netcdf.h"
. I think the proper include
is netcdf
, unless the tutorials are out-of-date.
EDIT 2: Following up on the comments:
- ""I think the proper include is netcdf": The include file is definitely named netcdf.h. Your find_package call should try to find netCDF, case matters here. In the netCDFTargets-debug.cmake there is a target defined with add_library(<> IMPORTED ...). Use this target name for your target_link_libraries command." – vre
Thank you for telling me about this file! The file netCDFTargets-debug.cmake
reads
#----------------------------------------------------------------
# Generated CMake target import file for configuration "DEBUG".
#----------------------------------------------------------------
# Commands may need to know the format version.
set(CMAKE_IMPORT_FILE_VERSION 1)
# Import target "netCDF::netcdf" for configuration "DEBUG"
set_property(TARGET netCDF::netcdf APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
set_target_properties(netCDF::netcdf PROPERTIES
IMPORTED_IMPLIB_DEBUG "${_IMPORT_PREFIX}/debug/lib/netcdf.lib"
IMPORTED_LOCATION_DEBUG "${_IMPORT_PREFIX}/debug/bin/netcdf.dll"
)
list(APPEND _IMPORT_CHECK_TARGETS netCDF::netcdf )
list(APPEND _IMPORT_CHECK_FILES_FOR_netCDF::netcdf "${_IMPORT_PREFIX}/debug/lib/netcdf.lib" "${_IMPORT_PREFIX}/debug/bin/netcdf.dll" )
# Commands beyond this point should not need to know the version.
set(CMAKE_IMPORT_FILE_VERSION)
So I changed my CMakeLists.txt
to
# Unit test for building a program with netCDF using CMake in visual studio.
cmake_minimum_required (VERSION 3.17)
project(cmake_netcdf)
# Add source to this project's executable.
add_executable(cmake_netcdf main.cpp)
# Find and include the netcdf package
find_package(netCDF CONFIG REQUIRED)
target_link_libraries(cmake_netcdf
PRIVATE netCDF::netcdf
)
and now main.cpp
builds! It builds using both #include <netcdf>
and #include "netcdf.h"
.
From here, I decided to change main.cpp
to an example file on NCAR's website, so main.cpp
now is
/* This is part of the netCDF package.
Copyright 2006 University Corporation for Atmospheric Research/Unidata.
See COPYRIGHT file for conditions of use.
This is a very simple example which writes a 2D array of
sample data. To handle this in netCDF we create two shared
dimensions, "x" and "y", and a netCDF variable, called "data".
This example is part of the netCDF tutorial:
http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-tutorial
Full documentation of the netCDF C++ API can be found at:
http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-cxx
$Id: simple_xy_wr.cpp,v 1.5 2010/02/11 22:36:43 russ Exp $
*/
#include <iostream>
#include <netcdf>
#include <vector>
using namespace std;
using namespace netCDF;
using namespace netCDF::exceptions;
// We are writing 2D data, a 6 x 12 grid.
static const int NX = 6;
static const int NY = 12;
// Return this in event of a problem.
static const int NC_ERR = 2;
int main()
{
// This is the data array we will write. It will just be filled
// with a progression of numbers for this example.
int dataOut[NX][NY];
// Create some pretend data. If this wasn't an example program, we
// would have some real data to write, for example, model output.
for (int i = 0; i < NX; i++)
for (int j = 0; j < NY; j++)
dataOut[i][j] = i * NY + j;
// The default behavior of the C++ API is to throw an exception i
// an error occurs. A try catch block is necessary.
try
{
// Create the file. The Replace parameter tells netCDF to overwrite
// this file, if it already exists.
NcFile dataFile("simple_xy.nc", NcFile::replace);
// Create netCDF dimensions
NcDim xDim = dataFile.addDim("x", NX);
NcDim yDim = dataFile.addDim("y", NY);
// Define the variable. The type of the variable in this case is
// ncInt (32-bit integer).
vector<NcDim> dims;
dims.push_back(xDim);
dims.push_back(yDim);
NcVar data = dataFile.addVar("data", ncInt, dims);
// Write the data to the file. Although netCDF supports
// reading and writing subsets of data, in this case we write all
// the data in one operation.
data.putVar(dataOut);
// The file will be automatically close when the NcFile object goes
// out of scope. This frees up any internal netCDF resources
// associated with the file, and flushes any buffers.
//cout << "*** SUCCESS writing example file simple_xy.nc!" << endl;
return 0;
}
catch (NcException& e)
{
e.what();
return NC_ERR;
}
}
When trying to build this example file, I get a bunch of linker errors
>------ Build All started: Project: cmake_netcdf, Configuration: x64-Debug ------
[1/2] Building CXX object CMakeFiles\cmake_netcdf.dir\main.cpp.obj
[2/2] Linking CXX executable cmake_netcdf.exe
FAILED: cmake_netcdf.exe
cmd.exe /C "cd . && "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" -E vs_link_exe --intdir=CMakeFiles\cmake_netcdf.dir --rc=C:\PROGRA~2\WI3CF2~1\10\bin\100183~1.0\x64\rc.exe --mt=C:\PROGRA~2\WI3CF2~1\10\bin\100183~1.0\x64\mt.exe --manifests -- C:\PROGRA~2\MICROS~1\2019\COMMUN~1\VC\Tools\MSVC\1427~1.291\bin\Hostx64\x64\link.exe /nologo CMakeFiles\cmake_netcdf.dir\main.cpp.obj /out:cmake_netcdf.exe /implib:cmake_netcdf.lib /pdb:cmake_netcdf.pdb /version:0.0 /machine:x64 /debug /INCREMENTAL /subsystem:console "C:\Program Files\vcpkg\installed\x64-windows\debug\lib\netcdf.lib" "C:\Program Files\vcpkg\installed\x64-windows\debug\lib\hdf5_hl_D.lib" "C:\Program Files\vcpkg\installed\x64-windows\debug\lib\hdf5_D.lib" "C:\Program Files\vcpkg\installed\x64-windows\debug\lib\libcurl-d.lib" "C:\Program Files\vcpkg\installed\x64-windows\debug\lib\zlibd.lib" wldap32.lib winmm.lib ws2_32.lib advapi32.lib crypt32.lib advapi32.lib crypt32.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && cmd.exe /C "cd /D "C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\build\x64-Debug" && powershell -noprofile -executionpolicy Bypass -file "C:/Program Files/vcpkg/scripts/buildsystems/msbuild/applocal.ps1" -targetBinary "C:/Users/Owner/Education and Research/Personal Projects/learning_coding/C++/cmake_netcdf/build/x64-Debug/cmake_netcdf.exe" -installedDir "C:/Program Files/vcpkg/installed/x64-windows/debug/bin" -OutVariable out""
LINK Pass 1: command "C:\PROGRA~2\MICROS~1\2019\COMMUN~1\VC\Tools\MSVC\1427~1.291\bin\Hostx64\x64\link.exe /nologo CMakeFiles\cmake_netcdf.dir\main.cpp.obj /out:cmake_netcdf.exe /implib:cmake_netcdf.lib /pdb:cmake_netcdf.pdb /version:0.0 /machine:x64 /debug /INCREMENTAL /subsystem:console C:\Program Files\vcpkg\installed\x64-windows\debug\lib\netcdf.lib C:\Program Files\vcpkg\installed\x64-windows\debug\lib\hdf5_hl_D.lib C:\Program Files\vcpkg\installed\x64-windows\debug\lib\hdf5_D.lib C:\Program Files\vcpkg\installed\x64-windows\debug\lib\libcurl-d.lib C:\Program Files\vcpkg\installed\x64-windows\debug\lib\zlibd.lib wldap32.lib winmm.lib ws2_32.lib advapi32.lib crypt32.lib advapi32.lib crypt32.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTFILE:CMakeFiles\cmake_netcdf.dir/intermediate.manifest CMakeFiles\cmake_netcdf.dir/manifest.res" failed (exit code 1120) with the following output:
C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\build\x64-Debug\main.cpp.obj : error LNK2019: unresolved external symbol "public: __cdecl netCDF::NcDim::NcDim(class netCDF::NcDim const &)" (??0NcDim@netCDF@@QEAA@AEBV01@@Z) referenced in function "public: static void __cdecl std::_Default_allocator_traits<class std::allocator<class netCDF::NcDim> >::construct<class netCDF::NcDim,class netCDF::NcDim &>(class std::allocator<class netCDF::NcDim> &,class netCDF::NcDim * const,class netCDF::NcDim &)" (??$construct@VNcDim@netCDF@@AEAV12@@?$_Default_allocator_traits@V?$allocator@VNcDim@netCDF@@@std@@@std@@SAXAEAV?$allocator@VNcDim@netCDF@@@1@QEAVNcDim@netCDF@@AEAV34@@Z)
C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\build\x64-Debug\main.cpp.obj : error LNK2019: unresolved external symbol "public: class netCDF::NcVar __cdecl netCDF::NcGroup::addVar(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class netCDF::NcType const &,class std::vector<class netCDF::NcDim,class std::allocator<class netCDF::NcDim> > const &)const " (?addVar@NcGroup@netCDF@@QEBA?AVNcVar@2@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEBVNcType@2@AEBV?$vector@VNcDim@netCDF@@V?$allocator@VNcDim@netCDF@@@std@@@5@@Z) referenced in function main
C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\build\x64-Debug\main.cpp.obj : error LNK2019: unresolved external symbol "public: class netCDF::NcDim __cdecl netCDF::NcGroup::addDim(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,unsigned __int64)const " (?addDim@NcGroup@netCDF@@QEBA?AVNcDim@2@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@_K@Z) referenced in function main
C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\build\x64-Debug\main.cpp.obj : error LNK2019: unresolved external symbol "public: __cdecl netCDF::NcFile::NcFile(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,enum netCDF::NcFile::FileMode)" (??0NcFile@netCDF@@QEAA@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@W4FileMode@01@@Z) referenced in function main
C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\build\x64-Debug\main.cpp.obj : error LNK2019: unresolved external symbol "public: virtual __cdecl netCDF::NcFile::~NcFile(void)" (??1NcFile@netCDF@@UEAA@XZ) referenced in function main
C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\build\x64-Debug\main.cpp.obj : error LNK2019: unresolved external symbol "public: void __cdecl netCDF::NcVar::putVar(void const *)const " (?putVar@NcVar@netCDF@@QEBAXPEBX@Z) referenced in function main
C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\build\x64-Debug\main.cpp.obj : error LNK2001: unresolved external symbol "class netCDF::NcInt netCDF::ncInt" (?ncInt@netCDF@@3VNcInt@1@A)
C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\build\x64-Debug\cmake_netcdf.exe : fatal error LNK1120: 7 unresolved externals
ninja: build stopped: subcommand failed.
Build All failed.
I tried replacing #include <netcdf>
with #include "netcdf.h"
but I got even more errors:
[1/2] Building CXX object CMakeFiles\cmake_netcdf.dir\main.cpp.obj
FAILED: CMakeFiles/cmake_netcdf.dir/main.cpp.obj
C:\PROGRA~2\MICROS~1\2019\COMMUN~1\VC\Tools\MSVC\1427~1.291\bin\Hostx64\x64\cl.exe /nologo /TP -DDEBUG -DH5_BUILT_AS_DYNAMIC_LIB -I"C:\Program Files\vcpkg\installed\x64-windows\include" /DWIN32 /D_WINDOWS /GR /EHsc /Zi /Ob0 /Od /RTC1 -MDd /showIncludes /FoCMakeFiles\cmake_netcdf.dir\main.cpp.obj /FdCMakeFiles\cmake_netcdf.dir\ /FS -c ..\..\main.cpp
C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\main.cpp(22): error C2871: 'netCDF': a namespace with this name does not exist
C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\main.cpp(23): error C2653: 'netCDF': is not a class or namespace name
C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\main.cpp(23): error C2871: 'exceptions': a namespace with this name does not exist
C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\main.cpp(53): error C2065: 'NcFile': undeclared identifier
C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\main.cpp(53): error C2146: syntax error: missing ';' before identifier 'dataFile'
C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\main.cpp(53): error C2653: 'NcFile': is not a class or namespace name
C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\main.cpp(53): error C2065: 'replace': undeclared identifier
C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\main.cpp(53): error C3861: 'dataFile': identifier not found
C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\main.cpp(56): error C2065: 'NcDim': undeclared identifier
C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\main.cpp(56): error C2146: syntax error: missing ';' before identifier 'xDim'
C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\main.cpp(56): error C2065: 'xDim': undeclared identifier
C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\main.cpp(56): error C2065: 'dataFile': undeclared identifier
C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\main.cpp(57): error C2065: 'NcDim': undeclared identifier
C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\main.cpp(57): error C2146: syntax error: missing ';' before identifier 'yDim'
C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\main.cpp(57): error C2065: 'yDim': undeclared identifier
C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\main.cpp(57): error C2065: 'dataFile': undeclared identifier
C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\main.cpp(61): error C2065: 'NcDim': undeclared identifier
C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\main.cpp(61): error C2923: 'std::vector': 'NcDim' is not a valid template type argument for parameter '_Ty'
C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\main.cpp(61): error C2976: 'std::vector': too few template arguments
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\include\vector(413): note: see declaration of 'std::vector'
C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\main.cpp(61): error C2133: 'dims': unknown size
C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\main.cpp(61): error C2512: 'std::vector': no appropriate default constructor available
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\include\vector(413): note: see declaration of 'std::vector'
C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\main.cpp(62): error C2065: 'xDim': undeclared identifier
C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\main.cpp(63): error C2065: 'yDim': undeclared identifier
C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\main.cpp(64): error C2065: 'NcVar': undeclared identifier
C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\main.cpp(64): error C2146: syntax error: missing ';' before identifier 'data'
C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\main.cpp(64): error C2065: 'dataFile': undeclared identifier
C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\main.cpp(64): error C2065: 'ncInt': undeclared identifier
C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\main.cpp(78): error C2061: syntax error: identifier 'NcException'
C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\main.cpp(78): error C2310: catch handlers must specify one type
C:\Users\Owner\Education and Research\Personal Projects\learning_coding\C++\cmake_netcdf\main.cpp(80): error C2065: 'e': undeclared identifier
ninja: build stopped: subcommand failed.
Build All failed.
Any insight on these new issues? A Google search brought me to this page which suggests that CMake is linking against a 32-bit version of the library (whereas my system is 64 bit), but I only have the 64-bit version of the library installed.
Also, with regards to #include <netcdf>
versus #include "netcdf.h"
, I have both files in C:\Program Files\vcpkg\installed\x64-windows\include
(along with a bunch of header files related to HDF5 and stuff). It seems like <netcdf>
is the whole thing while netcdf.h
is just part of it?
- "netcdf_DIR is where find_package searches for the headers and libraries. Can you cross check the target name as @vre mentioned?" – user3389943
I certainly can! netcdf_DIR
is C:/Program Files/vcpkg/installed/x64-windows/share/netcdf-c
, which I mentioned the contents of in Edit 1.
The netCDFTargets.cmake
file has the line add_library(netCDF::netcdf SHARED IMPORTED)
, which I used for the newest version of the target_link_libraries
command.
EDIT 3: Following up on the comments:
- "So what other targets are defined in netCDFTargets.cmake" – user3389943
I'm not entirely sure how to parse netCDFTargets.cmake
, so here are the contents:
# Generated by CMake
if("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" LESS 2.5)
message(FATAL_ERROR "CMake >= 2.6.0 required")
endif()
cmake_policy(PUSH)
cmake_policy(VERSION 2.6)
#----------------------------------------------------------------
# Generated CMake target import file.
#----------------------------------------------------------------
# Commands may need to know the format version.
set(CMAKE_IMPORT_FILE_VERSION 1)
# Protect against multiple inclusion, which would fail when already imported targets are added once more.
set(_targetsDefined)
set(_targetsNotDefined)
set(_expectedTargets)
foreach(_expectedTarget netCDF::netcdf)
list(APPEND _expectedTargets ${_expectedTarget})
if(NOT TARGET ${_expectedTarget})
list(APPEND _targetsNotDefined ${_expectedTarget})
endif()
if(TARGET ${_expectedTarget})
list(APPEND _targetsDefined ${_expectedTarget})
endif()
endforeach()
if("${_targetsDefined}" STREQUAL "${_expectedTargets}")
unset(_targetsDefined)
unset(_targetsNotDefined)
unset(_expectedTargets)
set(CMAKE_IMPORT_FILE_VERSION)
cmake_policy(POP)
return()
endif()
if(NOT "${_targetsDefined}" STREQUAL "")
message(FATAL_ERROR "Some (but not all) targets in this export set were already defined.\nTargets Defined: ${_targetsDefined}\nTargets not yet defined: ${_targetsNotDefined}\n")
endif()
unset(_targetsDefined)
unset(_targetsNotDefined)
unset(_expectedTargets)
# Compute the installation prefix relative to this file.
get_filename_component(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH)
get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH)
get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH)
if(_IMPORT_PREFIX STREQUAL "/")
set(_IMPORT_PREFIX "")
endif()
# Create imported target netCDF::netcdf
add_library(netCDF::netcdf SHARED IMPORTED)
set_target_properties(netCDF::netcdf PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include;${_IMPORT_PREFIX}/include"
INTERFACE_LINK_LIBRARIES "ZLIB::ZLIB;hdf5::hdf5-shared;hdf5::hdf5_hl-shared;CURL::libcurl"
)
if(CMAKE_VERSION VERSION_LESS 2.8.12)
message(FATAL_ERROR "This file relies on consumers using CMake 2.8.12 or greater.")
endif()
# Load information for each installed configuration.
get_filename_component(_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
file(GLOB CONFIG_FILES "${_DIR}/netCDFTargets-*.cmake")
foreach(f ${CONFIG_FILES})
include(${f})
endforeach()
# Cleanup temporary variables.
set(_IMPORT_PREFIX)
# Loop over all imported files and verify that they actually exist
foreach(target ${_IMPORT_CHECK_TARGETS} )
foreach(file ${_IMPORT_CHECK_FILES_FOR_${target}} )
if(NOT EXISTS "${file}" )
message(FATAL_ERROR "The imported target \"${target}\" references the file
\"${file}\"
but this file does not exist. Possible reasons include:
* The file was deleted, renamed, or moved to another location.
* An install or uninstall procedure did not complete successfully.
* The installation package was faulty and contained
\"${CMAKE_CURRENT_LIST_FILE}\"
but not all the files it references.
")
endif()
endforeach()
unset(_IMPORT_CHECK_FILES_FOR_${target})
endforeach()
unset(_IMPORT_CHECK_TARGETS)
# This file does not depend on other imported targets which have
# been exported from the same project but in a separate export set.
# Commands beyond this point should not need to know the version.
set(CMAKE_IMPORT_FILE_VERSION)
cmake_policy(POP)
Does that help?
Solution
Alright, I found a solution! It most certainly is not a perfect solution, but it is a solution.
Unfortunately, I was not able to get it to work on Visual Studio with Windows. I will probably try again at some point, but I think the version of netCDF-cxx4
is out of date on vcpkg
or something. I am currently away from my primary work station, so I will have to try again on there to see if I can get a solution in Visual Studio. Anyway, here's what I did that seemed to work:
- I downloaded Ubuntu 20.04.1 via the Windows Subsystem for Linux (WSL). I'm not sure if this will work for older or newer versions of Ubuntu, but I assume that it will. I also am using the Windows Terminal that they mention on that page and set up my colors with the
vimrc
example file found here.
This changes how your file system works a bit by adding two layers above C:\
, which are /mnt/
. You can navigate to your files on Windows by going to /mnt/c/Users/
and to the Ubuntu subsystem by going to /
. I named my Ubuntu account usr
, so the 'desktop' Ubuntu files are kept in /home/usr
. For all of the subsequent steps, I am using the Ubuntu terminal window in the Windows Terminal application.
There was also an issue with installing zlib
via vcpkg
after enabling WSL, but I don't know how to resolve it nor have I found a solution anywhere.
I downloaded a C++ compiler by running
sudo apt install build-essential
, and installed CMake and netCDF-C viasudo apt install cmake libnetcdf-dev
.I installed
netCDF-cxx4
by cloning their GitHub repository to my home directory/home/usr
and using the commands
mkdir build
cd build
cmake ..
make
ctest
sudo make install
If you don't have that sudo
there, you'll get a permissions error.
- I found the
netCDFCxxConfig.cmake
file in the directory/usr/local/lib/cmake/netcdf
and made some changes to theCMakeLists.txt
file
cmake_minimum_required(VERSION 3.8)
# Set project name and version
project(cmake_netcdfcxx4)
# Find the netcdf-cxx4 library
list(APPEND CMAKE_PREFIX_PATH "/usr/local/lib/cmake/netCDF")
find_package(netCDFCxx REQUIRED)
# Add source to this project's executable.
add_executable(cmake_netcdfcxx4 main.cpp)
# Link the netcdf-cxx4 library to the executable
target_link_libraries(cmake_netcdfcxx4
PRIVATE
netCDF::netcdf-cxx4
)
to add this directory to the CMAKE_PREFIX_PATH
variable. I'm still looking into how to add the directory /usr/local/lib/cmake/
to the CMake search path automatically so the user doesn't have to edit the CMakeLists.txt
file to compile this properly, so I guess this will require some updating.
I hope this helps people in the future!
Answered By - jltorchinsky