我正在尝试将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。我还修改了编译命令中的其他包含和链接,但我可以在必要时发布它们。
答案 0 :(得分:1)
问题在于a.cxx中的函数定义定义为
extern void f(void);
而不是
extern "C" void f(void);
或
extern "C" {
void f(void);
}
如果没有指定C样式extern
,编译器会破坏函数名称,b.c无法读取。