Cray平台编译libxml2失败:静态/动态库不匹配问题求助
解决libxml2编译时“attempted static link of dynamic object”链接错误
这个报错说白了就是链接器在尝试把动态库libxml2.so当成静态库来处理,大概率是你的编译配置或者Cray编译器环境的链接选项搞混了静态/动态库的处理逻辑。我给你几个针对性的解决思路:
1. 明确指定编译静态库或动态库
如果你的需求是静态库,直接在configure时禁用动态库、启用静态库:
libxml2/configure --prefix=local-icc CC=/opt/cray/pe/craype/2.5.14/bin/cc CXX=/opt/cray/pe/craype/2.5.14/bin/CC --enable-option-checking --host=x86_64-linux-gnu --without-zlib --disable-shared --enable-static
这样编译出来的只有静态库libxml2.a,链接时就不会出现动态库被误处理的问题。
如果需要动态库,那就反过来,禁用静态库、启用动态库:
libxml2/configure --prefix=local-icc CC=/opt/cray/pe/craype/2.5.14/bin/cc CXX=/opt/cray/pe/craype/2.5.14/bin/CC --enable-option-checking --host=x86_64-linux-gnu --without-zlib --enable-shared --disable-static
同时要确保链接阶段没有被强制加上-static这类静态链接参数。
2. 调整LDFLAGS避免强制静态链接
Cray的编译器封装层可能默认带了一些你没注意到的链接选项,你可以直接在configure时通过LDFLAGS明确指定动态链接:
libxml2/configure --prefix=local-icc CC=/opt/cray/pe/craype/2.5.14/bin/cc CXX=/opt/cray/pe/craype/2.5.14/bin/CC --enable-option-checking --host=x86_64-linux-gnu --without-zlib LDFLAGS="-dynamic"
另外,先检查下环境变量里有没有偷偷设置-static:
echo $LDFLAGS
如果有的话,先执行unset LDFLAGS再重新跑configure。
3. 适配Cray编译器的特殊配置
Cray的cc/CC是封装过的工具,有时候需要明确指定构建目标避免交叉编译误解,加上--build=x86_64-linux-gnu(和你的--host一致)试试:
libxml2/configure --prefix=local-icc CC=/opt/cray/pe/craype/2.5.14/bin/cc CXX=/opt/cray/pe/craype/2.5.14/bin/CC --enable-option-checking --host=x86_64-linux-gnu --build=x86_64-linux-gnu --without-zlib
验证方法
跑configure之后,你可以打开生成的Makefile,搜一下LDFLAGS和LIBXML2_LIBS,确认没有-static这类强制静态链接的参数;或者用make V=1编译,看看具体的链接命令里是不是正确调用了动态库,而不是把.so文件当成静态库来链接。
内容的提问来源于stack exchange,提问作者Martin Ueding
相关产品推荐
相关产品推荐

