C++ 链接到编译为C++;

C++ 链接到编译为C++;,c++,c,visual-c++,linker,static-libraries,C++,C,Visual C++,Linker,Static Libraries,我现在在链接器天堂。我有一个C++库,它只在Visual C++中编译(如果在/gp>中工作): 我把它编译成C++代码< /LI> 定义\uuucplusplus,这将导致所有声明都包含在extern“C”{} 因此,通过这样做,我有了一个静态库,比如说,bsbs.lib 现在,我有一个C++项目叫做“代码>测试者< /COD>,它想调用函数 BabBar < /C> >在代码< BSBS.H./Cube >中声明。一切都很顺利,直到我尝试链接到bsbs.lib,在那里我得到了非常熟悉的: T

我现在在链接器天堂。我有一个C++库,它只在Visual C++中编译(如果在/gp>中工作):

我把它编译成C++代码< /LI>
  • 定义
    \uuucplusplus
    ,这将导致所有声明都包含在
    extern“C”{}
  • 因此,通过这样做,我有了一个静态库,比如说,
    bsbs.lib

    <>现在,我有一个C++项目叫做“代码>测试者< /COD>,它想调用函数<代码> BabBar < /C> >在代码< BSBS.H./Cube >中声明。一切都很顺利,直到我尝试链接到
    bsbs.lib
    ,在那里我得到了非常熟悉的:

    Tester.obj : error LNK2001: unresolved external symbol _foofoo
    
    无论我在
    Tester
    中调用哪个函数(
    barbar
    或其他任何函数),它似乎总是
    foooo
    无法解决

    更新:我已根据要求扩展了第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 */
    
    \ifndef\u BSBS\u H
    #定义
    *防止C++程序从名称中修改这些定义。*
    #ifdef_uucplusplus
    外部“C”{
    #恩迪夫
    #包括
    #包括
    .......
    .......
    #ifdef_uucplusplus
    }
    #恩迪夫
    #endif/*_BSBS_H*/
    
    可以说,这是“主”头文件。所有重要的功能都在这里。但是还有其他由
    bsbs.c
    文件调用的头文件,它们不是
    extern“c{}
    中包含的头文件

    已解决:
    好的,这很奇怪,但是我从代码中删除了<代码>外部c>代码>位,在代码> BSBS中编译成C++项目(即使所有文件都是代码> C.<代码>,并删除了<代码>我在看了符号列表后有了这个想法。除了
    extern C
    (doh)中包含的那些之外,所有的东西都被弄坏了,它要求一个未混合的符号,所以我认为有些地方不对劲。

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

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

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

    也许编译器/链接器组合需要知道要导出/导入哪些API?如果是这样,我会尝试在C++库中添加适当的代码(例如, DLimPult和/或DLLouth)。< /P> < P>如果在LIB中将它们声明为ExtEnC(不需要,如果您从C++调用它们),那么它们必须在您的标题中为Extn C。< /P> < P>文件是否导入其他LIB文件?可以将库文件编译为显式链接库文件或隐式链接库文件。一种方法是将lib文件放在一个大球中,另一种方法是将它们作为单独的lib,所有lib都需要在最终应用程序的编译时链接。如果foooo是从另一个lib文件导入到您的lib文件中的,那么将该lib文件包括在最终项目中。根据您的描述,这是我最好的猜测,也是目前为止我通过同事处理lib文件时最常被问到的问题。

    而您没有引用“\u fooo”测试程序代码中的任何地方?你在第2点中的确切意思是什么?我认为我们需要看到一些可能错误的代码是你缺少的第三个库中的
    foooo
    ,即
    bsbs.lib
    可能还需要其他东西?在“在VC中编译(它可能在gcc中工作)”中显示的童年天真和天真真的让我很开心为什么不把C库编译成C代码呢?你不应该在任何地方定义
    \uuucplusplus
    ,这取决于实现。我不这么认为,因为
    foooo
    是在
    bsbs.lib
    中定义的,它似乎是独立的。嗯,我在别处定义了输入库,所以它读的是
    bsbs.lib
    ,我不认为是这样,因为
    foooo
    似乎是完全定义的。如果它们是外部C,它们就是外部C。你不能混搭。如果lib将它们导出为extern C,那么您必须将它们导入为extern C。