CMake 未定义的符号到外部

CMake undefined symbol to 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,它工作正常,但是当我尝试使用 [=32 中的 say_hello =], 我得到

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 and analyzer.c/h are of interest) and here 是我正在调用的文件 A.cxx。我还删除了编译命令中的其他包含和链接,但如果需要,我可以 post 那些。

问题出在 a.cxx 中定义为

的函数定义
extern void f(void);

而不是

extern "C" void f(void);

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

如果不指定 C 风格 extern,编译器会破坏函数名称,b.c 无法读取这些名称。