我有一个头文件
// 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/