4

I'm trying to use the NVIDIA's nvapi, and I have compilation errors I don't fully understand. Perhaps I am using the wrong compiler?

#include "nvapi.h"
#include <iostream>

int main()
{
    printf("Hello nvapi!");
    return 0;
}

Compilation: g++ nvapi_hello.cpp

Output (truncated because it was too long):

In file included from nvapi_lite_d3dext.h:35:0,
                 from nvapi.h:6,
                 from nvapi_hello.cpp:1:
nvapi_lite_salstart.h:821:41: warning: '__success' initialized and declared 'extern'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                         ^
nvapi.h:99:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_Initialize();
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:42: error: expected primary-expression before 'return'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                          ^
nvapi.h:99:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_Initialize();
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:41: warning: '__success' initialized and declared 'extern'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                         ^
nvapi.h:134:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_Unload();
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:41: error: redefinition of 'int __success'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                         ^
nvapi.h:134:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_Unload();
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:32: note: 'int __success' previously defined here
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                ^
nvapi.h:99:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_Initialize();
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:42: error: expected primary-expression before 'return'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                          ^
nvapi.h:134:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_Unload();
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:41: warning: '__success' initialized and declared 'extern'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                         ^
nvapi.h:153:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_GetErrorMessage(NvAPI_Status nr,NvAPI_ShortString szDesc);
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:41: error: redefinition of 'int __success'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                         ^
nvapi.h:153:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_GetErrorMessage(NvAPI_Status nr,NvAPI_ShortString szDesc);
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:32: note: 'int __success' previously defined here
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                ^
nvapi.h:99:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_Initialize();
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:42: error: expected primary-expression before 'return'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                          ^
nvapi.h:153:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_GetErrorMessage(NvAPI_Status nr,NvAPI_ShortString szDesc);
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:41: warning: '__success' initialized and declared 'extern'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                         ^
nvapi.h:174:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_GetInterfaceVersionString(NvAPI_ShortString szDesc);
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:41: error: redefinition of 'int __success'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                         ^
nvapi.h:174:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_GetInterfaceVersionString(NvAPI_ShortString szDesc);
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:32: note: 'int __success' previously defined here
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                ^
nvapi.h:99:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_Initialize();
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:42: error: expected primary-expression before 'return'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                          ^
nvapi.h:174:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_GetInterfaceVersionString(NvAPI_ShortString szDesc);
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:41: warning: '__success' initialized and declared 'extern'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                         ^
nvapi.h:319:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_GPU_GetEDID(NvPhysicalGpuHandle hPhysicalGpu, NvU32 displayOutputId, NV_EDID *pEDID);
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:41: error: redefinition of 'int __success'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                         ^
nvapi.h:319:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_GPU_GetEDID(NvPhysicalGpuHandle hPhysicalGpu, NvU32 displayOutputId, NV_EDID *pEDID);
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:32: note: 'int __success' previously defined here
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                ^
nvapi.h:99:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_Initialize();
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:42: error: expected primary-expression before 'return'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                          ^
nvapi.h:319:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_GPU_GetEDID(NvPhysicalGpuHandle hPhysicalGpu, NvU32 displayOutputId, NV_EDID *pEDID);
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:41: warning: '__success' initialized and declared 'extern'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                         ^
nvapi.h:669:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_SetView(NvDisplayHandle hNvDisplay, NV_VIEW_TARGET_INFO *pTargetInfo, NV_TARGET_VIEW_MODE targetView);
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:41: error: redefinition of 'int __success'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                         ^
nvapi.h:669:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_SetView(NvDisplayHandle hNvDisplay, NV_VIEW_TARGET_INFO *pTargetInfo, NV_TARGET_VIEW_MODE targetView);
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:32: note: 'int __success' previously defined here
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                ^
nvapi.h:99:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_Initialize();
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:42: error: expected primary-expression before 'return'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                          ^
nvapi.h:669:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_SetView(NvDisplayHandle hNvDisplay, NV_VIEW_TARGET_INFO *pTargetInfo, NV_TARGET_VIEW_MODE targetView);
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:41: warning: '__success' initialized and declared 'extern'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                         ^
nvapi.h:808:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_SetViewEx(NvDisplayHandle hNvDisplay, NV_DISPLAY_PATH_INFO *pPathInfo, NV_TARGET_VIEW_MODE displayView);
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:41: error: redefinition of 'int __success'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                         ^
nvapi.h:808:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_SetViewEx(NvDisplayHandle hNvDisplay, NV_DISPLAY_PATH_INFO *pPathInfo, NV_TARGET_VIEW_MODE displayView);
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:32: note: 'int __success' previously defined here
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                ^
nvapi.h:99:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_Initialize();
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:42: error: expected primary-expression before 'return'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                          ^
nvapi.h:808:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_SetViewEx(NvDisplayHandle hNvDisplay, NV_DISPLAY_PATH_INFO *pPathInfo, NV_TARGET_VIEW_MODE displayView);
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:41: warning: '__success' initialized and declared 'extern'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                         ^
nvapi.h:1030:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_GetDisplayDriverVersion(NvDisplayHandle hNvDisplay, NV_DISPLAY_DRIVER_VERSION *pVersion);
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:41: error: redefinition of 'int __success'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                         ^
nvapi.h:1030:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_GetDisplayDriverVersion(NvDisplayHandle hNvDisplay, NV_DISPLAY_DRIVER_VERSION *pVersion);
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:32: note: 'int __success' previously defined here
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                ^
nvapi.h:99:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_Initialize();
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:42: error: expected primary-expression before 'return'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                          ^
nvapi.h:1030:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_GetDisplayDriverVersion(NvDisplayHandle hNvDisplay, NV_DISPLAY_DRIVER_VERSION *pVersion);
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:41: warning: '__success' initialized and declared 'extern'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                         ^
nvapi.h:1159:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_OGL_ExpertModeSet(NvU32 expertDetailLevel,
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:41: error: redefinition of 'int __success'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                         ^
nvapi.h:1159:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_OGL_ExpertModeSet(NvU32 expertDetailLevel,
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:32: note: 'int __success' previously defined here
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                ^
nvapi.h:99:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_Initialize();
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:42: error: expected primary-expression before 'return'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                          ^
nvapi.h:1159:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_OGL_ExpertModeSet(NvU32 expertDetailLevel,
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:41: warning: '__success' initialized and declared 'extern'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                         ^
nvapi.h:1167:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_OGL_ExpertModeGet(NvU32 *pExpertDetailLevel,
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:41: error: redefinition of 'int __success'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                         ^
nvapi.h:1167:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_OGL_ExpertModeGet(NvU32 *pExpertDetailLevel,
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:32: note: 'int __success' previously defined here
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                ^
nvapi.h:99:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_Initialize();
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:42: error: expected primary-expression before 'return'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                          ^
nvapi.h:1167:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_OGL_ExpertModeGet(NvU32 *pExpertDetailLevel,
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:41: warning: '__success' initialized and declared 'extern'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                         ^
nvapi.h:1209:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_OGL_ExpertModeDefaultsSet(NvU32 expertDetailLevel,
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:41: error: redefinition of 'int __success'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                         ^
nvapi.h:1209:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_OGL_ExpertModeDefaultsSet(NvU32 expertDetailLevel,
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:32: note: 'int __success' previously defined here
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                ^
nvapi.h:99:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_Initialize();
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:42: error: expected primary-expression before 'return'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                          ^
nvapi.h:1209:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_OGL_ExpertModeDefaultsSet(NvU32 expertDetailLevel,
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:41: warning: '__success' initialized and declared 'extern'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                         ^
nvapi.h:1216:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_OGL_ExpertModeDefaultsGet(NvU32 *pExpertDetailLevel,
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:41: error: redefinition of 'int __success'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                         ^
nvapi.h:1216:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_OGL_ExpertModeDefaultsGet(NvU32 *pExpertDetailLevel,
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:32: note: 'int __success' previously defined here
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                ^
nvapi.h:99:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_Initialize();
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:42: error: expected primary-expression before 'return'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                          ^
nvapi.h:1216:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_OGL_ExpertModeDefaultsGet(NvU32 *pExpertDetailLevel,
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:41: warning: '__success' initialized and declared 'extern'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                         ^
nvapi.h:1251:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_EnumTCCPhysicalGPUs( NvPhysicalGpuHandle nvGPUHandle[NVAPI_MAX_PHYSICAL_GPUS], NvU32 *pGpuCount);
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:41: error: redefinition of 'int __success'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                         ^
nvapi.h:1251:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_EnumTCCPhysicalGPUs( NvPhysicalGpuHandle nvGPUHandle[NVAPI_MAX_PHYSICAL_GPUS], NvU32 *pGpuCount);
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:32: note: 'int __success' previously defined here
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                ^
nvapi.h:99:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_Initialize();
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:42: error: expected primary-expression before 'return'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                          ^
nvapi.h:1251:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_EnumTCCPhysicalGPUs( NvPhysicalGpuHandle nvGPUHandle[NVAPI_MAX_PHYSICAL_GPUS], NvU32 *pGpuCount);
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:41: warning: '__success' initialized and declared 'extern'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                         ^
nvapi.h:1282:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_EnumLogicalGPUs(NvLogicalGpuHandle nvGPUHandle[NVAPI_MAX_LOGICAL_GPUS], NvU32 *pGpuCount);
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:41: error: redefinition of 'int __success'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                         ^
nvapi.h:1282:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_EnumLogicalGPUs(NvLogicalGpuHandle nvGPUHandle[NVAPI_MAX_LOGICAL_GPUS], NvU32 *pGpuCount);
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:32: note: 'int __success' previously defined here
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                ^
nvapi.h:99:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_Initialize();
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:42: error: expected primary-expression before 'return'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                          ^
nvapi.h:1282:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_EnumLogicalGPUs(NvLogicalGpuHandle nvGPUHandle[NVAPI_MAX_LOGICAL_GPUS], NvU32 *pGpuCount);
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:41: warning: '__success' initialized and declared 'extern'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                         ^
nvapi.h:1308:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_GetPhysicalGPUsFromDisplay(NvDisplayHandle hNvDisp, NvPhysicalGpuHandle nvGPUHandle[NVAPI_MAX_PHYSICAL_GPUS], NvU32 *pGpuCount);
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:41: error: redefinition of 'int __success'
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                         ^
nvapi.h:1308:1: note: in expansion of macro 'NVAPI_INTERFACE'
 NVAPI_INTERFACE NvAPI_GetPhysicalGPUsFromDisplay(NvDisplayHandle hNvDisp, NvPhysicalGpuHandle nvGPUHandle[NVAPI_MAX_PHYSICAL_GPUS], NvU32 *pGpuCount);
 ^~~~~~~~~~~~~~~
nvapi_lite_salstart.h:821:32: note: 'int __success' previously defined here
 #define NVAPI_INTERFACE extern __success(return == NVAPI_OK) NvAPI_Status __cdecl
                                ^
 ...

I installed mingw-w64 and I'm using g++ version:

g++ (x86_64-posix-sjlj-rev2, Built by MinGW-W64 project) 6.3.0
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

I've downloaded NVIDIA's NVAPI SDK from https://developer.nvidia.com/gameworksdownload#?search=nvapi

HEADLESS_0NE
  • 3,416
  • 4
  • 32
  • 51
  • This question http://stackoverflow.com/questions/4176763/what-does-this-macro-do-successreturn-0-long suggests that `__success` is defined in `sal.h`. Try to include it. The same question suggests that `__success` doesn't change program behaviour, thus you could try to do `#define __success(...)` if you have problems with abovementioned header. – HolyBlackCat Apr 19 '17 at 17:39
  • Try including 1st as the header file looks like it contains quite a few MS specific #defines. – Richard Critten Apr 19 '17 at 17:40
  • @HolyBlackCat Tried both of your suggestions, including `sal.h` didn't change anything. Defining `__success(...)` somewhat helped but I am still getting compilation errors. @RichardCritten I tried including `` first, but it didn't change anything, sadly. – HEADLESS_0NE Apr 19 '17 at 18:45
  • What are those new errors? – HolyBlackCat Apr 19 '17 at 19:23
  • A bunch of compilation errors regarding other `__in`, `__inout`, `pDisplayIdCount`, and a few others not declared in this scope. It seems like the header files provided in the NVAPI SDK are not compatible with `g++`. Building a VS2010 solution using `CMake` seems to work...but I'm still running into other issues. – HEADLESS_0NE Apr 19 '17 at 20:32
  • @RichardCritten: It seems like your suggestion actually does resolve the problem I was having once I'm using the Microsoft C/C++ compiler. Also, I found this related answer/question http://stackoverflow.com/questions/30030311/nvapi-nvapi-interface-missing-explicit-type – HEADLESS_0NE Apr 20 '17 at 12:49

2 Answers2

5

I found an answer here that explains these variables are created with #define in the file nvapi_lite_salstart.h and then undefined using #undef in the file nvapi_lite_salend.h which is called at the start and end respectively in each of the header files, as listed here at the start of nvapi.h:

#include"nvapi_lite_salstart.h" //Remove this line
#include"nvapi_lite_common.h"
#include"nvapi_lite_sli.h"
#include"nvapi_lite_surround.h"
#include"nvapi_lite_stereo.h"
#include"nvapi_lite_d3dext.h"
#include"nvapi_lite_salstart.h" //Add this line to fix the errors

As you can see, it appears the "salstart" file just needs to be moved to the end of the list because for some reason it's incorrectly at the top. Not sure why this works properly in Visual Studio (it does without making the above modifications), but this at least it fixed those errors in MinGW; however, the precompiled library file provided by nVidia (either nvapi.lib or nvapi64.lib) is NOT compatible with MinGW, so you're forced to use MS Visual Studio.

MasterHD
  • 2,264
  • 1
  • 32
  • 41
  • 1
    I'm happy someone followed up on this! Too bad I no longer work at the place where I was attempting to use this. Oh well :) I hope it will be useful to someone else! I wish this NVIDIA API was better documented though, seriously – HEADLESS_0NE Aug 24 '18 at 12:47
  • Saved me hours, thanks, man, really apprectiate. Just for info this step is necessary even with with VC++ (at last VS2019). – CJ_Notned Jun 30 '22 at 11:45
2

It seems like the header files provided in NVIDIA's API aren't compatible with g++/GCC compiler. So I opted to use Microsoft's C/C++ x64 compiler. I used CMake (v3.5.2) to create a Visual Studio 2010 solution, and that has been working fine after some fiddling with my CMakeLists.txt file.

This is the content of my CMakeLists.txt:

cmake_minimum_required(VERSION 3.5)
include_directories(3rdparty)
link_directories(3rdparty/amd64)
add_executable(nvapi_test nvapi_hello.cpp)
target_link_libraries(nvapi_test nvapi64.lib)

And the 3rdparty directory contains the amd64 folder where nvapi64.lib is, as well as the NVAPI's *.h and *.c files.

Also, as mentioned in the comments to my question (@RichardCritten), I had to add #include <Windows.h> at the top of my .cpp file for it to compile correctly.

HEADLESS_0NE
  • 3,416
  • 4
  • 32
  • 51