链接到编译为C ++的C库

时间:2010-06-14 21:11:19

标签: c++ c visual-c++ linker static-libraries

我现在正处于连接器天堂。我有一个C库,它只能在Visual C ++中编译(它可能在gcc中工作),如果:

  1. 我将其编译为C ++代码
  2. 定义__cplusplus,这会导致所有声明都包含在extern "C" { }
  3. 因此,通过这样做,我有一个名为bsbs.lib

    的静态库

    现在,我有一个名为Tester的C ++项目,它希望在barbar中声明函数bsbs.h。一切顺利,直到我尝试链接到bsbs.lib,在那里我得到了太熟悉了:

    Tester.obj : error LNK2001: unresolved external symbol _foofoo
    

    无论我在foofooTester或其他任何内容)中调用哪个函数,它似乎总是barbar无法解决。

    更新:我已根据要求扩展了第2点。非常感谢帮助人员!

    #ifndef _BSBS_H
    #define _BSBS_H
    
    /* Prevent C++ programs from name mangling these definitions. */
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    #include <stdio.h>
    #include <setjmp.h>
    .......
    .......
    #ifdef __cplusplus
    }
    #endif
    
    #endif /* _BSBS_H */
    

    这是“主”头文件,可以这么说。所有重要的功能都在这里。但是bsbs.c文件调用的其他头文件在extern "C" {}中包含

    解决: 好的,这很奇怪,但我从extern C中的头文件中删除了bsbs位,将其编译为C ++项目(即使所有文件都是.c并删除了{ {1}}定义)并且它有效!看完符号列表后我明白了。一切都被严重除了 __cplusplus(doh)中所包含的内容,并且它要求一个没有咒语的符号,所以我觉得有些不对劲。

5 个答案:

答案 0 :(得分:2)

您的链接中不包含c库中可能存在依赖关系。您所包含的c库是否真的是对DLL的引用?如果是这样的话,有一个名为'depends'的程序会告诉你其他所需的DLL是什么。

答案 1 :(得分:2)

如果你在lib中将它们声明为extern C(这是不必要的,如果你是用C ++调用它们的话),那么它们必须是你标题中的extern C.

答案 2 :(得分:0)

我假设您已添加了链接器引用。 E.g:

#pragma comment(lib, "bsbs.lib")

答案 3 :(得分:0)

可能需要让编译器/链接器组合知道要导出/导入哪些API?如果是这样,我会尝试将相应的__declspec(例如dllimport和/或dllexport)添加到C ++库。

答案 4 :(得分:0)

您的lib文件是否导入任何其他lib文件?您可以将lib文件编译为explicity链接lib文件或隐式。有一种方法可以将lib文件放在一个巨大的球中,另一种方法是将它们作为单独的库,所有这些都需要在最终应用程序的编译时进行链接。如果foofoo是从另一个lib文件导入lib文件中的,那么在最终项目中包含该lib文件。这是我对你描述的内容的最好猜测,也是我在通过同事处理lib文件时最常见的问题。