library linking between c and cpp

关于c c++ libraries互相linking的问题。

undefined reference

有几次在link libraries的时候会出现 undefined reference 的问题,明明已经把.so文件放到了命令后面,但还是有问题。除了网上找的到的常见原因,还有一个比较容易忽略的就是name mangling的问题。比如使用nm命令进行查看,注意调用方和被调用方都需要查看一下。

1
2
3
-bash-4.2$ nm CMakeFiles/main.dir/main.cpp.o
0000000000000000 T main
U _Z3foov

这个是main生成的.o文件中的symbol

这个是目标library的symbol

1
2
3
4
5
-bash-4.2$ nm libfoo.so 
...
00000000000006a4 T _fini
0000000000000685 T foo
...

可以看到里面的symbol是不一样的,究其原因就是编译main文件的时候采用的是cpp的compiler(main.cpp文件),而编译libfoo的时候采用的是c的compiler(foo.c)。具体fix的手段一种是采用相同的compiler,比如都使用cpp的,或者是都使用c的。或者是按照stackoverflow这里的解释,采用extern C的关键字来强制地按照c的方式进行编译。

具体使用CMake的时候,由于它会根据后缀自动选择,因此最好显示地指定compiler或者使用的语言

reference

https://stackoverflow.com/questions/18877437/undefined-reference-to-errors-when-linking-static-c-library-with-c-code

推荐文章