[英]Linking C compiled static library to C++ Program
我试图将一个静态库(用gcc编译)链接到一个c ++程序,我得到了'未定义的引用'。 我在ubuntu 12.04服务器机器上使用了gcc和g ++版本4.6.3。 例如,以下是factorial方法的简单库文件:
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;
}
假设在/ home / test目录中有静态库libfact.a,我编译了我的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
添加任何内容才能使其正常工作? 问题是你没有告诉你的C ++程序,因子是用C语言编写的。你需要更改你的test.h头文件。 像这样
#ifndef __MYLIB_H_
#define __MYLIB_H_
#ifdef __cplusplus
extern "C" {
#endif
int factorial(int n);
#ifdef __cplusplus
}
#endif
#endif
现在你的头文件应该适用于C和C ++程序。 详情请见此处 。
包含双下划线的BTW名称是为compliler保留的(因此名称以下划线和大写字母开头)所以#ifndef __MYLIB_H_
严格来说是非法的。 我会改为#ifndef MYLIB_H #define MYLIB_H
虽然接受的答案绝对正确,但我想我只是添加一个观察。 有些编辑器在打开/关闭大括号时遇到问题,并且会在标题中缩进整个extern "C"
范围。 如果mylib.h
是库的键标题,您可以考虑:
#if defined (__cplusplus)
#define _MYLIB_INIT_DECL extern "C" {
#define _MYLIB_FINI_DECL }
#else
#define _MYLIB_INIT_DECL
#define _MYLIB_FINI_DECL
#endif
mylib
库中的所有其他头文件,例如mylib_aux.h
,可以采用以下形式:
#ifndef _MYLIB_AUX_H
#define _MYLIB_AUX_H
#include <mylib.h>
_MYLIB_INIT_DECL
... header content ...
_MYLIB_FINI_DECL
#endif /* _MYLIB_AUX_H */
显然,我使用的名称是任意的,但对于多个库头文件,这种方法对我很有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.