将C编译的静态库链接到C++;节目 我试图将静态库(编译成GCC)链接到C++程序中,得到“未定义的引用”。我在ubuntu 12.04服务器上使用了gcc和g++版本4.6.3。例如,以下是factorial方法的简单库文件:
mylib.h将C编译的静态库链接到C++;节目 我试图将静态库(编译成GCC)链接到C++程序中,得到“未定义的引用”。我在ubuntu 12.04服务器上使用了gcc和g++版本4.6.3。例如,以下是factorial方法的简单库文件:,c++,c,linux,gcc,g++,C++,C,Linux,Gcc,G++,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
#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中添加任何内容才能使其正常工作
问题是,你还没有告诉你的C++程序,因子写在C.中,你需要改变你的测试。像这样
#ifndef __MYLIB_H_
#define __MYLIB_H_
#ifdef __cplusplus
extern "C" {
#endif
int factorial(int n);
#ifdef __cplusplus
}
#endif
#endif
<>现在你的头文件应该同时用于C和C++程序。有关详细信息,请参阅
顺便说一句,包含双下划线的名称是为compliler保留的(以下划线和大写字母开头的名称也是如此),因此严格来说,
\ifndef\uu MYLIB\uh
是非法的。我会改为#如果ndef 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 */
\ifndef\MYLIB\u AUX\H
#定义_MYLIB_AUX_H
#包括
_MYLIB_INIT_DECL
... 标题内容。。。
_MYLIB_FINI_DECL
#endif/*_MYLIB_AUX_H*/
显然,我使用的名称是任意的,但是对于多个库标题,这种方法对我很有用。是的,它的工作原理与此类似。谢谢你的链接。感谢您添加有关双下划线的信息。非常好的解释+当我看到这么多没有投票权的问题,以及7票赞成的答案时,我完全理解人类是多么愚蠢。如果问题不相关,答案如何相关?来吧