我有一个头文件

// Creates a new graph with n vertices and no edges
graph_t *graph_create(int n);

.c文件
graph_t *graph_create(int n)
{
    graph_t *g;
    int     i;

    //g = malloc(sizeof(graph_t));
    g->V = n;
    g->E = 0;

    return g;
}

这是我的CMakeLists.txt的样子
cmake_minimum_required(VERSION 3.3)
project(Thesis)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES main.cpp graph.h graph.c shared.h)
add_executable(Thesis ${SOURCE_FILES})

我从graph_t *g = graph_create(15);调用main.cpp,并且收到以下错误消息,指出该方法未定义:



我究竟做错了什么 ?

最佳答案

假设函数是在graph.c C源文件中定义的,那么问题就出在name mangling

C++使用整齐的名称来处理诸如重载之类的事情,而C则不需要。如果要使用C源文件或C库中的函数,则需要告诉C++编译器不要使用整齐的名称,这是通过extern "C"构造完成的,如

extern "C" graph_t *graph_create(int n);

但这有一个问题,那就是C编译器不会知道extern "C"的意思,并且会抱怨。为此,您需要使用预处理器进行条件编译,并检查C++或C编译器是否正在使用头文件。这是通过检查__cplusplus宏的存在来完成的:
#ifdef __cplusplus
extern "C"
#endif
graph_t *graph_create(int n);

如果您有多种功能,请将其放在大括号内:
#ifdef __cplusplus
extern "C" {
#endif

graph_t *graph_create(int n);
// More functions here...

#ifdef __cplusplus
}  // End of extern "C" block
#endif

关于c++ - Clion链接失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35555166/

10-13 07:25