库文件中找不到符号问题:CMAKE_CXX_FLAGS: -fvisibility=hidden

问题描述: 编译出来的预测库发现找不到符号,但是相关源文件的确编译到库里了。

定位问题: cmake配置中打开了以下开关:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")

`-fvisibility=hidden`开关的作用,将编译 出的库文件中的全局变量符号默认隐藏,防止其他程序调用库文件时出现重定义。也可以降低库文件体积。

导致的问题,我们新注册的接口已经编译到库文件中,但是却查询不到,undefination

解决方法:在对应cc文件中的接口定义处加上`可视化标记`: `__attribute__((visibility("default")))`

// 原始代码,库文件中查询不到
ImagePreprocess::ImagePreprocess(ImageFormat srcFormat,	ImagePreprocess::ImagePreprocess(ImageFormat srcFormat,
                                 ImageFormat dstFormat,	                                 ImageFormat dstFormat,
                                 TransParam param) {	                                 TransParam param) {
  this->srcFormat_ = srcFormat;	  this->srcFormat_ = srcFormat;
  this->dstFormat_ = dstFormat;	  this->dstFormat_ = dstFormat;
  this->transParam_ = param;	  this->transParam_ = param;
}

修改后的代码(可被库文件查询到):

__attribute__((visibility("default")))
ImagePreprocess::ImagePreprocess(ImageFormat srcFormat,	ImagePreprocess::ImagePreprocess(ImageFormat srcFormat,
                                 ImageFormat dstFormat,	                                 ImageFormat dstFormat,
                                 TransParam param) {	                                 TransParam param) {
  this->srcFormat_ = srcFormat;	  this->srcFormat_ = srcFormat;
  this->dstFormat_ = dstFormat;	  this->dstFormat_ = dstFormat;
  this->transParam_ = param;	  this->transParam_ = param;
}	}

可以参考这个github 的修改PR。

 

 

你可能感兴趣的:(C++框架开发,PaddlePaddle开发)