Вызов C-кода из C ++ в проекте CMake. Неопределенный символ. Есть внешний C - PullRequest
0 голосов
/ 20 января 2019

Я пытаюсь создать проект CMake, который вызывает код C из C ++, и я получаю неопределенные символы, хотя я (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

Что я делаю неправильно?

1 Ответ

0 голосов
/ 20 января 2019

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.

...