Ya vimos SIGAR en Linux >>

Utilizar la librería en Wintendo es bastante banal ya que en el zip vienen \sigar-bin\include y \sigar-bin\lib, el primero de los cuales es el include path y el segundo el search path.

No obstante, en tiempo de ejecución ésto va a reclamar que no puede encontrar el .dll sigar-x86-winnt.dll.
No encuentra dll de SIGARÉsto se soluciona copiándolo en C:\WINDOWS\system32 o en al lado del .exe en la carpeta \Debug o \Release de nuestro proyecto. ¿Pero no habrá alguna manera de linkear SIGAR estáticamente? O sea ¿que quede dentro de nuestro ejecutable?

Una opción es compilar SIGAR desde sus fuentes como librería estática. La otra sería hacer una librería que la importe como .dll y se exporte como .lib > pero ¿ésto implicaría escribir código? No lo sé…

Como tengo los fuentes en GitHub >> voy a intentar lo primero a ver si sale fácil. … improvisando …

Primero me bajo CMake >> y lo configuro con la herramienta de compilación de Visual Stupido 2008.
CMake configurado para compilador de Visual Stupido 2008Ésto me genera automágicamente un proyecto de Visual Stupido 2008 sigar.sln.
Éste no compila ya que escupe

win32_sigar.obj : error LNK2019: unresolved external symbol _sigar_proc_args_wmi_get referenced in function _sigar_remote_proc_args_get
win32_sigar.obj : error LNK2019: unresolved external symbol _sigar_proc_exe_wmi_get referenced in function _sigar_proc_exe_get@16

según este post >> que hay que bajar este fuente que se les quedó en el tintero >>, pero no, mi versión sí lo tiene. lo que hice fue comentar estos métodos en el fuente, lo que habría que hacer probablemente es bajar el branch 1.6 de git…y no, sigue el error a pesar que cambié el tipo de configuración a .lib así
¿aquí es donde se especifica el tipo de resultado de la compilación?y de que genera un .lib (con un .dll) en C:\Program Files\sigar\lib\

Lo que sí resulta es compilar el proyecto sigar, no ALL_BUILD, éste deja en las carpetsd Debug\ y Release\ (respectivamente) las dos versiones de la librería estática.

Cuando la importemos dentro de otro proyecto, empero, reclamará porque no encuentra símbolos usados por ésta… los cuales son

  • la función GetFileVersionInfo >>
  • la función VerQueryValue >>
  • la función NetApiBufferFree >>

Como vemos en las páginas, ésto se soluciona linkeando con las librerías Netapi32.lib (el último) y Version.lib (los demás)

Pero que compile no signifique que funcione… de partida en Debug se tira un expresivo

The system cannot execute the specified program

el que luce así en el Event Viewer (¿!??)

Generate Activation Context failed for C:\Documents and Settings\nn\My Documents\Visual Studio 2008\Projects\MiApp\Debug\MiApp.exe. Reference error message: The operation completed successfully.

y en Release, si bien corre, devuelve valores sin ningún sentido…


Pero lo que no es trivial es que en la función para la cual estoy usando SIGAR, que es para saber el porcentaje de utilización del CPU, hay que utilizar sys/poll.h, ya que tiene que poder analizarlo durante algunos milisegundos sin interrumpirlo. Sin embargo, este fuente es de Unix y – era que no – en Wintendo no existe un equivalente.

Al final la solucion para ésto era la función select( ), que es equivalente a poll( ) y que sí se encuentra en Wintendo >>

 //TODO guards
 #include<Winsock2.h >
//poll(0,0,500);
select(0,NULL,NULL,NULL,NULL);
Este sitio utiliza cookies.    Leer más