Pregunta

Es un largo tiempo desde que he usado C, pero ahora estoy tratando de compilar un pequeño script que obtiene server-estadísticas del Apache-portable-Runtime (APR).

archivos de cabecera situado en /usr/include/apr-1/apr*.h y librerías se encuentran en / usr / lib64 / libapr-1. *

Los archivos fuente se pueden encontrar en el sitio oficial de abril http: // apr. apache.org/docs/apr/1.3/files.html .

/* test.c */
#include <stdio.h>
#include <stdlib.h>
#include <apr_general.h>
#include <apr_time.h>

int main(int argc, const char *argv[])
{
    apr_time_t t;
    t = apr_time_now();
    printf("The current time: %" APR_TIME_T_FMT "[us]\n", t);
    return 0;
}

Cuando intento compilar y me sale el siguiente error (que creo que es un tema que une):

~> gcc -Wall $(apr-1-config --cflags --cppflags --includes --link-ld) test.c -o test.bin
/tmp/cc4DYD2W.o: In function `main':
test.c:(.text+0x10): undefined reference to `apr_time_now'
collect2: ld returned 1 exit status

Mi entorno es gentoo:

~> uname -a
Linux alister 2.6.32.21-grsec-gt-r2 #1 SMP Tue Sep 7 23:54:49 PDT 2010\
x86_64 Intel(R) Xeon(R) CPU L5640 @ 2.27GHz GenuineIntel GNU/Linux`
~> gcc -v 
gcc version 4.3.4 (Gentoo 4.3.4 p1.1, pie-10.1.5)
~> emerge --search "%@^dev-lib.*apr"
*  dev-libs/apr
   Latest version installed: 1.3.9
*  dev-libs/apr-util
   Latest version installed: 1.3.9

¿alguien con más experiencia con C en Linux tiene alguna sugerencia para mí conseguir este trabajo?

Como siempre gracias por adelantado.

¿Fue útil?

Solución 2

Finalmente se decidió a mirar en esto.

gcc menciona -l dos veces en diferentes contextos:

Linker Options
object-file-name -llibrary ...
Directory Options
... -Idir -Ldir ...

así que moví el -llib después de que el nombre de objeto (para conseguir el segundo contexto) y compiló!

APR_CFG=$(apr-1-config --cflags --cppflags --includes --link-ld) 
gcc -Wall test.c -o test.bin $APR_CFG
./test.bin
The current time: 1332999950442660[us]

No estoy totalmente seguro de entender el orden que une y por qué no lo hizo antes de que el trabajo (si alguien puede arrojar algo de luz sobre que sería fantástico), pero por ahora no tengo lo suficiente como para continuar.

Otros consejos

gcc -Wall -I/usr/include/apr-1 -L/usr/lib64 -lapr-1 test.c -o test.bin

-l especifica que compartían la biblioteca para enlazar a, mientras que especifica -L dónde buscar bibliotecas compartidas.

abril proporciona una herramienta para hacer esto más fácil, apr-1-config. Algo como esto debería funcionar:

gcc -Wall $(apr-1-config --cflags --cppflags --includes --link-ld) test.c -o test.bin
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top