{"id":1196,"date":"2026-06-04T08:34:00","date_gmt":"2026-06-04T06:34:00","guid":{"rendered":"https:\/\/www.pinguytaz.net\/?p=1196"},"modified":"2026-06-03T20:23:06","modified_gmt":"2026-06-03T18:23:06","slug":"construyendo-un-agente-de-ia-nativo-con-c-y-llama-cpp-i","status":"publish","type":"post","link":"https:\/\/www.pinguytaz.net\/index.php\/2026\/06\/04\/construyendo-un-agente-de-ia-nativo-con-c-y-llama-cpp-i\/","title":{"rendered":"Construyendo un Agente de IA Nativo con C y Llama.cpp (I)"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Antes de empezar conoceremos como instalar el API de \u00abLlama.cpp\u00bb y como compilar un ejemplo b\u00e1sico de LLM directamente en C tanto en Linux como en compilaci\u00f3n cruzada Linux-Windows.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Todo el c\u00f3digo de esta explicaci\u00f3n al igual que ficheros auxiliares como \u00abMakefile\u00bb se encuentran en GitHub de forma que se iran actualizando nuevos ejemplos \u00ab<a href=\"https:\/\/github.com\/pinguytaz\/IA\/tree\/main\/Llama.cpp\">https:\/\/github.com\/pinguytaz\/IA\/tree\/main\/Llama.cpp<\/a>\u00ab<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Instalaci\u00f3n y Compilaci\u00f3n Cruzada (Linux &amp; Windows)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">El primer reto es preparar el entorno. Queremos que nuestro c\u00f3digo sea portable a windows por eso compilaremos llama.cpp tambi\u00e9n para windows, con libreria estaticas para as\u00ed solo tener que llevar el ejecutable (.elf en linux y .exe en Windows) y los ficheros auxiliares como modelos o prompts.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Linux: \n    cmake -B build -DBUILD_SHARED_LIBS=OFF -DGGML_BLAS=ON -DGGML_BLAS_VENDOR=Intel10_64ilp\n    cmake --build build --config Release -j\n\nWindows:  Cross-Compilation: mingw-w64-gcc \n    cmake -B build-windows -DCMAKE_SYSTEM_NAME=Windows -DCMAKE_C_COMPILER=x86_64-w64-mingw32-gcc -DCMAKE_CXX_COMPILER=x86_64-w64-mingw32-g++ -DBUILD_SHARED_LIBS=OFF\n    cmake --build build-windows --config Release -j<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Utilizamos un Makefile para la compilaci\u00f3n, pero explicaremos los par\u00e1metros que nos permitir\u00e1n saber el porque de cada uno.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>******** Compilamos en Linux ********************\n   gcc -O2 -Wall -fopenmp -I.\/llama.cpp\/include -I.\/llama.cpp\/ggml\/include -I.\/llama.cpp\/common .\/src\/Base\/Base.c -L.\/llama.cpp\/build\/src -L.\/llama.cpp\/build\/ggml\/src -L.\/llama.cpp\/build\/ggml\/src\/ggml-blas -L.\/llama.cpp\/build\/common  -lllama -lggml -lggml-base -lggml-cpu -lggml-blas  -lopenblas -lpthread -lm -lstdc++ -ldl -o .\/bin\/Base.elf\n\n\n******** Compilamos en Windows   ********************\n   x86_64-w64-mingw32-gcc -O2 -Wall -fopenmp -static -I.\/llama.cpp\/include -I.\/llama.cpp\/ggml\/include -I.\/llama.cpp\/common .\/src\/Base\/Base.c -L.\/llama.cpp\/buildWindows\/src -L.\/llama.cpp\/buildWindows\/ggml\/src -L.\/llama.cpp\/buildWindows\/ggml\/src\/ggml-blas -L.\/llama.cpp\/buildWindows\/common  -lllama -l:ggml.a -l:ggml-base.a -l:ggml-cpu.a  -lpthread -lm -lstdc++ -o .\/bin\/Base.exe<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Compilador<\/strong>: gcc para Linux y x86_64-w64-mingw32-gcc para la compilaci\u00f3n cruzada de windows.<\/li>\n\n\n\n<li><strong>-O2<\/strong>:  Aplicamos una optimizaci\u00f3n de nivel 2.<\/li>\n\n\n\n<li><strong>-Wall: Activa la mayor\u00eda<\/strong> de los avisos \u00fatiles.<\/li>\n\n\n\n<li><strong>-fopenmp<\/strong>: Activa OpenMP, por si el c\u00f3digo o alguna librer\u00eda usa paralelismo.<\/li>\n\n\n\n<li><strong>-static<\/strong> (para la compilaci\u00f3n est\u00e1tica en Windows) obliga a GCC a meter todas las librer\u00edas dentro del .exe. <\/li>\n\n\n\n<li><strong>-I<\/strong> A\u00f1ade los directorios include<\/li>\n\n\n\n<li><strong>-L<\/strong> Directorio librer\u00edas para el enlazado .a (Estaticas) .so(dinamicas)<\/li>\n\n\n\n<li><strong>-o<\/strong>   Nombre del ejecutable<\/li>\n\n\n\n<li><strong>Librer\u00edas<\/strong>\n<ul class=\"wp-block-list\">\n<li><strong>Llama<\/strong>\n<ul class=\"wp-block-list\">\n<li>-lllama Enlaza con libllama <\/li>\n\n\n\n<li>-lggml -lggml-base -lggml-cpu -lggml-blas     Enlaza con las librerias: libggml, base, backend CPU, backend BLAS.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Librer\u00edas <\/strong>del sistema\n<ul class=\"wp-block-list\">\n<li>-lopenblas Enlaza con OpenBLAS<\/li>\n\n\n\n<li>-lpthread Soporte de Thread POSIX<\/li>\n\n\n\n<li>-lm Liberia matem\u00e1tica<\/li>\n\n\n\n<li>-ldl Carga din\u00e1mica Simbolos de Linux, esta no la pondremos en la compilaci\u00f3n windows.<\/li>\n\n\n\n<li>-lstdc++ Biblioteca estandard C++ ya que llama.cpp\/ggml esta en C++.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Continuaremos en el pr\u00f3ximo con la explicaci\u00f3n ya directamente del c\u00f3digo, del ejemplo Base, que realiza una sencilla inferencia.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Antes de empezar conoceremos como instalar el API de \u00abLlama.cpp\u00bb y como compilar un ejemplo b\u00e1sico de LLM directamente en C tanto en Linux como en compilaci\u00f3n cruzada Linux-Windows. Todo el c\u00f3digo de esta explicaci\u00f3n al igual que ficheros auxiliares como \u00abMakefile\u00bb se encuentran en GitHub de forma que se iran actualizando nuevos ejemplos \u00abhttps:\/\/github.com\/pinguytaz\/IA\/tree\/main\/Llama.cpp\u00ab [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1197,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-container-style":"default","site-container-layout":"default","site-sidebar-layout":"default","disable-article-header":"default","disable-site-header":"default","disable-site-footer":"default","disable-content-area-spacing":"default","footnotes":""},"categories":[218,210,212,217],"tags":[216,214,215,213],"class_list":["post-1196","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-compilacion-cruzada-mingw","category-ia","category-llama-cpp-ia","category-windows","tag-hugingface","tag-ia","tag-llama-cpp","tag-llm"],"_links":{"self":[{"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/posts\/1196","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/comments?post=1196"}],"version-history":[{"count":3,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/posts\/1196\/revisions"}],"predecessor-version":[{"id":1200,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/posts\/1196\/revisions\/1200"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/media\/1197"}],"wp:attachment":[{"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/media?parent=1196"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/categories?post=1196"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/tags?post=1196"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}