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

Posted

技术标签:

【中文标题】在 CMake 项目中从 C++ 调用 C 代码。未定义的符号。有外部 C【英文标题】:Calling C code from C++ in a CMake project. Undefined symbol. Have extern C 【发布时间】:2019-01-20 19:11:39 【问题描述】:

我正在尝试构建一个从 C++ 调用 C 代码的 CMake 项目,并且我得到未定义的符号,即使我(AFAIK)正确使用“extern C”。

CMakeLists.txt:

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

main.cpp:

#include "lib.h"

int main()

    printit();
    return 0;

lib.c:

#include <stdio.h>
#include "lib.h"

int printit()

    printf("Hello world\n");
    return 0;

lib.h:

extern "C" int printit();

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

如果我只是从命令行构建它,它可以正常工作:

g++ main.cpp lib.c

我做错了什么?

【问题讨论】:

由于您同时拥有 C 和 CXX 源代码,因此您应该在 CMakeLists.txt 中使用 project(CTest LANGUAGES C CXX) 【参考方案1】:

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 源,因此您的项目调用应在 CMakeLists.txt 中启用 C 以及 project(CTest LANGUAGES C CXX)

【讨论】:

以上是关于在 CMake 项目中从 C++ 调用 C 代码。未定义的符号。有外部 C的主要内容,如果未能解决你的问题,请参考以下文章

用于从 FORTRAN 代码调用的 C++ 函数调用 C++ 代码的 Cmake 配置文件

在 Linux 中从 C++ 库调用 C++ 函数

使用cmake混编c和c++

windows10系统下基于pybind11库进行c++代码调用python(pytorch)代码

Android在C ++ JNI代码中从另一个活动类调用Java函数

在同一解决方案中从 c# 项目到 c++ 项目的 DllImport