代码之家  ›  专栏  ›  技术社区  ›  Jacob

链接到C++编译的C库

  •  2
  • Jacob  · 技术社区  · 15 年前

    我现在在Linker Paradise。我有一个C库,它只编译在Visual C++中(它可能在GCC中工作):

    1. 我把它编译成C++代码
    2. 定义 __cplusplus 导致所有声明都包含在 extern "C" { }

    所以,通过这样做,我有一个静态库,叫做, bsbs.lib

    现在,我有一个C++项目叫做 Tester 哪个要调用函数 barbar 在申报中 bsbs.h . 一切正常,直到我尝试链接到 BSBS.LIB 在这里我变得太熟悉了:

    Tester.obj : error LNK2001: unresolved external symbol _foofoo
    

    似乎总是 foofoo 无论我调用哪个函数,都无法解析 测试器 ( 巴巴尔 或者别的什么)。

    更新: 我已经按要求扩展了第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 并移除 阿普拉普拉斯 定义)而且它起作用了!我是在看了符号列表后才想到这个主意的。所有东西都被弄坏了 除了 被封闭的 外部C (DOH)它要求一个未混合的符号,所以我觉得有问题。

    5 回复  |  直到 15 年前
        1
  •  2
  •   Puppy    15 年前

    如果在LIB中将它们声明为ExtEnC(不必要,如果您从C++调用它们),那么它们必须在您的头中为ExcN C。

        2
  •  2
  •   Jay    15 年前

    您的链接中可能没有包含在C库中的依赖项。您包含的C库是否真的是对dll的引用?如果是这样的话,有一个名为“depends”的程序,它将告诉您其他需要的dll是什么。

        3
  •  0
  •   Jim Lamb    15 年前

    我假设您添加了一个链接器引用。例如。:

    #pragma comment(lib, "bsbs.lib")
    
        4
  •  0
  •   fbrereto    15 年前

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

        5
  •  0
  •   Jay Kramer    15 年前

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