Как скомпилировать тестовый скрипт APR - PullRequest
2 голосов
/ 04 ноября 2010

Уже давно я не использую C, но сейчас я пытаюсь скомпилировать короткий скрипт, который получает статистику сервера из Apache-Portable-Runtime (APR).

Заголовочные файлы, расположенные по адресу /usr/include/apr-1/apr*.h, и libs - по адресу /usr/lib64/libapr-1.*

Исходные файлы можно найти на официальном сайте APR 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;
}

Когда я пытаюсь скомпилировать, я получаю следующую ошибку (которая, по моему мнению, является проблемой связывания):

~> 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

Моя среда 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

Кто-нибудь с большим опытом работы с C в Linux может предложить мне эту работу?

Как всегда, спасибо заранее.

Ответы [ 2 ]

0 голосов
/ 29 марта 2012

Я наконец дошел до того, чтобы разобраться в этом.

gcc упоминает -l дважды в разных контекстах:

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

поэтому я переместил -llib после имени объекта (чтобы получить второй контекст), и он скомпилирован!

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]

Я не совсем уверен, что понимаю порядок связывания и почему он не работал раньше (если бы кто-то мог пролить свет на это, это было бы фантастически), но сейчас у меня достаточно, чтобы продолжить.

0 голосов
/ 04 ноября 2010
gcc -Wall -I/usr/include/apr-1 -L/usr/lib64 -lapr-1 test.c -o test.bin

-l указывает, к какой общей библиотеке подключаться, а -L указывает, где искать общие библиотеки.

APR предоставляет инструмент, облегчающий эту задачу, apr-1-config. Примерно так должно работать:

gcc -Wall $(apr-1-config --cflags --cppflags --includes --link-ld) test.c -o test.bin
...