Clion链接失败

时间:2016-02-22 13:39:49

标签: c++ clion

我有一个头文件

// 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

我做错了什么?

1 个答案:

答案 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