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

时间:2019-01-20 19:11:40

标签: c++ cmake linker extern calling-convention

我正在尝试构建一个CMake项目,该项目从C ++调用C代码,尽管我正确地(AFAIK)使用“外部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

我在做什么错了?

1 个答案:

答案 0 :(得分: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中启用project(CTest LANGUAGES C CXX)