将未定义的符号设为外部

时间:2016-06-01 15:58:16

标签: makefile cmake extern

我正在尝试将Makefile项目转换为CMake项目。该项目有一个文件a.cxx,它具有extern函数声明:

extern int shared_int;
extern void say_hello(void);

int main(int argc, char ** argv)
{
        say_hello();
        return 0;
}

该函数的定义在b.c:

#include <stdio.h>

int shared_int = 5;

void say_hello()
{
        printf("Hello!\n");
}

我的CMakeLists.txt如下:

project(extern_example)

add_executable(extern_example a.cxx b.c)

如果我更改要在a.cc中使用的printf来打印shared_int,它可以正常工作,但是当我尝试使用来自a.cxx的say_hello时,我得到< / p>

CMakeFiles/extern_example.dir/a.cxx.o: In function `main':
a.cxx:(.text+0x10): undefined reference to `say_hello()'
collect2: error: ld returned 1 exit status
CMakeFiles/extern_example.dir/build.make:120: recipe for target 'extern_example' failed
make[2]: *** [extern_example] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/extern_example.dir/all' failed
make[1]: *** [CMakeFiles/extern_example.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

该错误使得b.c在可执行文件中没有正确链接,但为什么shared_int可用?

我试图尽可能地使其成为一般,但有问题的文件是on BitBucket(Makefile和analyzer.c / h是有意义的),here是我&#39的文件;我打电话给A.cxx。我还修改了编译命令中的其他包含和链接,但我可以在必要时发布它们。

1 个答案:

答案 0 :(得分:1)

问题在于a.cxx中的函数定义定义为

extern void f(void);

而不是

extern "C" void f(void);

extern "C" {
    void f(void);
}

如果没有指定C样式extern,编译器会破坏函数名称,b.c无法读取。