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

链接器错误与链接器无关[重复]

  •  0
  • new_stacker  · 技术社区  · 7 年前

    我有一个非常具体的链接器错误案例:

    '调用:GCC C C++链接器4[arm linux gnueabihf]' arm-linux-gnueabihf-g++-lpthread ./src/FPGA\U外围设备/AUX\U IMU/AUX\U IMU\U功能。o
    ./src/主要。o: 在中 函数main': ../src/主要。cpp:7: 未定义的引用 `函数()'

    出于此帖子的目的,错误输出被截断。将突出显示错误和函数定义所在的对象。


    代码使用DS-5 C/C++Eclipse平台和GCC 4进行编译和链接。x[arm linux gnueabihd](DS-5内置)工具链:

    • GCC C++编译器4[arm linux gnueabihf]
    • GCC C编译器4[arm linux gnueabihf]
    • GCC汇编程序4[arm linux gnueabihf]
    • GCC C链接器4[arm linux gnueabihf]
    • GCC C++链接器4[arm linux gnueabihf]
    • GCC Archiver 4[arm linux gnueabihf]

    使用Gnu Make Builder。


    源代码在文件夹中结构化:

    • src

      主要的cpp公司

      • FPGA\U外围设备

        • AUX\U IMU

        标题。h类

        AUX\U IMU\U功能。c


    产生错误的最低限度代码:

    主要的cpp公司

    #include "header.h"
    
    int main() {
        function();
        return 0;
    }
    

    标题。h类

    void function(void);
    

    AUX\U IMU\U功能。c

    #include "header.h" 
    
    void function(void){
        int i = 3;
    };
    

    C代码是使用GCC C编译器4[arm linux gnueabihf]正确编译的。 C++代码(本示例中未包含的其他文件)是使用GCC C C++链接器4[arm linux gnueabihf]正确编译的。


    这显然不是链接器相关的问题,但如果链接器仍然产生此错误,还需要检查什么?


    一旦我将文件重新命名为,错误就会消失。水电站和。cpp公司 . 为什么会这样?GCC C和GCC C++是否产生不兼容的结果。o对象?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Jonathan Leffler    7 年前

    出现错误的原因是C++类型安全链接会损坏函数名。您需要告诉C++编译器 function() 具有C连杆:

    extern "C" void function(void);
    

    但是,如果C和C++编译器都应该使用相同的头,通常可以使用

    #ifdef __cplusplus
    extern "C"
    #endif
    void function(void);
    

    对于单个函数声明,或使用

    #ifdef __cplusplus
    extern "C" {
    #endif 
    
    void function(void);
    int  response(int arg);
    …
    
    #ifdef __cplusplus
    }
    #endif 
    

    围绕具有C链接的函数的函数声明块。

    您还可以在C中使用现有的标头,并在C++代码中使用:

    extern "C" {
    #include "header.h"
    }