前言
最近在sylixos上,使用c++编写动态库,导出相应接口给c/c++使用,在某些头文件包含不对的情况,导致动态库中的函数没有导出相应的接口,c/c++使用动态库接口时,应用运行起来报"can not find symbol:xxxx"问题。
c++工程代码说明
首先我们先使用Real Evo-IDE新建一个c++ app工程,工程中包含3个文件,如图:
其中
libtest.h为测试动态库头文件;
libtest.h中已经增加extern "C"导出相应的接口。
libtest.cpp为测试动态库实现代码(为了演示复现错误,本次将动态库文件和应用文件一起编译成一个app);
libtest.cpp没有#include “libtest.h”
app_c++test.cpp为应用程序
app_c++test.cpp主要是包含libtest.h头文件,并调用其void libtest_func()方法。
编译与运行
点击编译,可以看到程序编译成功。
此时我们上传到测试板卡中。
在板卡终端命令行中运行此程序,运行程序时系统报错,报“/apps/app_c++test/app_c++test can not find symbol: libtest_func”,及找不到libtest_func函数的符号。
找不到符号的原因
为什么编译的时候,libtest.h头文件已经增加了extern "C"导出接口,且app_c++test.cpp也包含了libtest.h文件,而且libtest.cpp也已经实现了这个方法,并且整个编译过程没有错误发生,最终程序运行时仍然报找不到符号呢。
问题就出现在libtest.cpp没有包含libtest.h,导致编译时编译器不知道该文件应该以c++代码方式编译,__cplusplus宏才可以生效,将libtest.cpp增加libtest.h文件夹包含进来,如下图,再重新编译。
编译完成后,再将程序上传到板卡中,在板卡终端命令行中重新执行该程序,此时应用程序可以成功运行。