将C编译的静态库链接到C++;节目 我试图将静态库(编译成GCC)链接到C++程序中,得到“未定义的引用”。我在ubuntu 12.04服务器上使用了gcc和g++版本4.6.3。例如,以下是factorial方法的简单库文件:

将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

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中添加任何内容才能使其正常工作

  • 问题是,你还没有告诉你的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票赞成的答案时,我完全理解人类是多么愚蠢。如果问题不相关,答案如何相关?来吧