我有一个头文件
// 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
,我收到以下错误,说该方法未定义:
“C:\ Program Files(x86)\ JetBrains \ CLion 1.2.4 \ bin \ cmake \ bin \ cmake.exe” --build C:\ Users \ Shiro.CLion12 \ system \ cmake \ generated \ 6e6ca233 \ 6e6ca233 \ Debug --target论文 - -j 8扫描目标论文的依赖关系[66%]构建CXX对象CMakeFiles / Thesis.dir / main.cpp.obj [66%]建设 C对象CMakeFiles / Thesis.dir / graph.c.obj [100%]链接CXX 可执行文件Thesis.exe CMakeFiles \ Thesis.dir / objects.a(main.cpp.obj): 在函数
main': C:/Users/Shiro/ClionProjects/Thesis/main.cpp:7: undefined reference to
graph_create(int)'collect2.exe:错误:ld 返回1退出状态CMakeFiles \ Thesis.dir \ build.make:121:recipe 目标'Thesis.exe'失败mingw32-make.exe [3]:[Thesis.exe] 错误1 CMakeFiles \ Makefile2:66:目标的配方 'CMakeFiles / Thesis.dir / all'失败的CMakeFiles \ Makefile2:78:配方 目标'CMakeFiles / Thesis.dir / rule'失败Makefile:117:食谱for 目标'论文'失败了mingw32-make.exe [2]: [CMakeFiles / Thesis.dir / all]错误2 mingw32-make.exe [1]: [CMakeFiles / Thesis.dir / rule]错误2 mingw32-make.exe:[论文] 错误2
我做错了什么?
答案 0 :(得分:3)
假设该函数是在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