代码之家  ›  专栏  ›  技术社区  ›  user240515 ephemerr

在CGEAR项目中从C++调用C代码。未定义的符号。有外交官

  •  0
  • user240515 ephemerr  · 技术社区  · 6 年前

    我试图建立一个Cube项目,它调用C++的C代码,而我得到了未定义的符号,即使我正确地使用了“ExtEng+C”。

    CMakeLists.txt:

    cmake_minimum_required(VERSION 3.0)
    project(CTest LANGUAGES CXX)
    add_executable(test main.cpp lib.c)
    

    MCP.CPP:

    #include "lib.h"
    
    int main()
    {
        printit();
        return 0;
    }
    

    C:

    #include <stdio.h>
    #include "lib.h"
    
    int printit()
    {
        printf("Hello world\n");
        return 0;
    }
    

    H.

    extern "C" int printit();
    

    这给了我一个“未定义的printit引用”错误。

    如果我只是从命令行构建它,它会很好地工作:

    g++ main.cpp lib.c
    

    我做错什么了?

    1 回复  |  直到 6 年前
        1
  •  1
  •   vre    6 年前

    extern "C" 是C++语法。因此,您的头文件LIB。h不能从C中使用。如果您将其更改如下,它也可以从C++和C中使用。

    #ifndef LIB_H_HEADER
    #define LIB_H_HEADER
    
    #ifdef __cplusplus
    extern "C" 
    {
    #endif
    
    int printit();
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif /* LIB_H_HEADER */
    

    由于您有C和Cxx源,所以项目调用也应该启用C project(CTest LANGUAGES C CXX) 在cmakelists.txt中。