Boost 1.80.0编译-fvisibility=hidden致运行时未定义符号求助
解决Boost 1.80.0编译时无法覆盖默认可见性选项的问题
针对编译Boost 1.80.0静态库时,默认的-fvisibility-inlines-hidden -fvisibility=hidden选项导致运行时未定义符号的问题,以下是几个可行的解决方法:
方法一:使用b2全局visibility选项覆盖
你之前使用的local-visibility=global是目标级别的局部配置,优先级低于Boost工具链的全局设置。正确的全局可见性控制选项是visibility=global,修改后的编译命令如下:
./b2 --prefix=../build_local --exec-prefix=../build_local --build-type=complete variant=release link=static runtime-link=static threading=multi --layout=versioned -d+2 visibility=global cxxflags=-fPIC --without-python -a install
方法二:修改Boost工具链配置文件
由于你使用的GCC 4.4.8属于较老版本,Boost的默认GCC配置会强制启用隐藏可见性。可以直接修改工具链配置文件来取消这一设置:
- 打开Boost源码目录下的
tools/build/src/tools/gcc.jam文件 - 搜索以下代码块:
if $(visibility-hidden) { flags GCC.compile OPTIONS <visibility-hidden>on : -fvisibility=hidden ; flags GCC.compile OPTIONS <visibility-inlines-hidden>on : -fvisibility-inlines-hidden ; } - 注释掉这几行代码,或者将
<visibility-hidden>on改为<visibility-hidden>off - 保存文件后重新执行编译命令
方法三:通过宏定义强制全局可见
在编译时通过cxxflags定义BOOST_SYMBOL_VISIBLE宏,覆盖Boost内部的可见性控制逻辑:
./b2 --prefix=../build_local --exec-prefix=../build_local --build-type=complete variant=release link=static runtime-link=static threading=multi --layout=versioned -d+2 cxxflags="-fPIC -DBOOST_SYMBOL_VISIBLE=__attribute__((visibility(\"default\"))) -DBOOST_SYMBOL_HIDDEN=" --without-python -a install
为什么之前的尝试无效?
local-visibility=global仅作用于单个构建目标,无法覆盖Boost工具链的全局默认配置- 直接在命令行传递
-fvisibility=default时,b2的内置工具链配置会强制追加-fvisibility=hidden,导致你的选项被覆盖
内容的提问来源于stack exchange,提问作者Zied ALAYA
相关产品推荐
相关产品推荐

