【发布时间】:2013-10-04 12:44:40
【问题描述】:
我试图将一个静态库(用 gcc 编译)链接到一个 c++ 程序,但我得到了“未定义的引用”。我在 ubuntu 12.04 服务器机器上使用了 gcc 和 g++ 版本 4.6.3。例如,下面是阶乘法的简单库文件:
mylib.h
#ifndef __MYLIB_H_
#define __MYLIB_H_
int factorial(int n);
#endif
mylib.c
#include "mylib.h"
int factorial(int n)
{
return ((n>=1)?(n*factorial(n-1)):1);
}
我使用 gcc 为这个 mylib.c 创建了对象:
gcc -o mylib.o -c mylib.c
再次使用 AR 实用程序从目标文件创建静态库:
ar -cvq libfact.a mylib.o
我用 C 程序 (test.c) 和 C++ 程序 (test.cpp) 测试了这个库
C 和 C++ 程序具有相同的主体:
#include "mylib.h"
int main()
{
int fact = factorial(5);
return 0;
}
假设静态库 libfact.a 在 /home/test 目录中可用,我编译我的 C 程序没有任何问题:
gcc test.c -L/home/test -lfact
但是在测试 C++ 程序时,它抛出了一个链接错误:
g++ test.cpp -L/home/test -lfact
test.cpp:(.text+0x2f): undefined reference to `factorial(int)'
collect2: ld returned 1 exit status
我什至尝试在 test.cpp 中添加 extern 命令:
extern int factorial(int n) //added just before the main () function
还是同样的错误。
- 谁能告诉我这里哪里错了?
- 在创建静态库时有什么遗漏的吗?
- 我是否必须在我的
test.cpp中添加任何内容才能使其正常工作?
【问题讨论】:
-
当我看到没有赞成票的 SO 问题以及 7 票赞成的答案时,我完全理解人类是多么愚蠢。如果问题不相关,答案怎么可能相关?加油!