2

自从我使用 C 以来已经很长时间了,但现在我正在尝试编译一个从 Apache-Portable-Runtime (APR) 获取服务器统计信息的短脚本。

头文件位于 /usr/include/apr-1/apr*.h 和库位于 /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:在函数“主”中:
test.c:(.text+0x10): undefined reference to `apr_time_now'
collect2: ld 返回 1 个退出状态

我的环境是gentoo:

~> unname -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 版本 4.3.4 (Gentoo 4.3.4 p1.1, pie-10.1.5)
~> 出现 --search "%@^dev-lib.*apr"
* 开发库/apr
   安装的最新版本:1.3.9
* 开发库/apr-util
   安装的最新版本:1.3.9

有没有在 Linux 上对 C 有更多经验的人对我有什么建议可以让它工作?

一如既往地提前感谢。

4

2 回答 2

0
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
于 2010-11-04T18:33:17.830 回答
0

我终于开始研究这个了。

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]

我不完全确定我理解链接顺序以及为什么它以前不起作用(如果有人可以阐明它会很棒)但现在我有足够的继续。

于 2012-03-29T05:56:54.390 回答