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 无法读取这些名称。
我正在尝试将 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 无法读取这些名称。