Ubuntu下编译静态OpenSSL与LibCURL出现未定义引用问题求助
问题分析与解决方案
首先针对你的两个疑惑逐一解释,再给出具体的修复步骤:
1. 为什么错误信息指向OpenSSL源码路径?
这是正常现象——静态库在编译时会保留调试符号,其中包含了编译该目标文件时的原始源码路径。报错里显示的/home/jjimenez/software/openssl-1.1.0g/只是符号对应的源码位置,不代表静态库本身缺少代码,真正的问题是链接时找不到zlib的符号定义。
2. 关于nm输出的T和U符号含义
- 对于
/usr/local/lib/libz.a:T inflateInit_表示该符号在libz.a的某个目标文件中已定义(属于代码段的符号);U inflateInit_则是libz.a内部其他目标文件对该符号的引用——静态库是多个目标文件的归档包,内部符号引用是正常的,整个libz.a的符号是完整的,无需担心。
- 对于OpenSSL的
libcrypto.a:U inflateInit_说明OpenSSL的zlib压缩模块(c_zlib.o)依赖这些zlib符号,但这些符号并没有被编译进libcrypto.a中。你编译OpenSSL时启用了zlib支持,只是告诉OpenSSL要调用zlib的功能,并没有把zlib的代码合并到OpenSSL的静态库中——静态编译OpenSSL指的是OpenSSL自身生成静态库,它仍然依赖外部的静态zlib库,需要在链接时显式引入。
修复步骤
步骤1:重新编译OpenSSL,明确指定zlib路径
你之前编译OpenSSL时没有指定zlib的具体位置,可能导致OpenSSL没有正确关联静态zlib。重新配置并编译:
cd $HOME/software/openSSL1.1.0g make clean LIBS="-lz -ldl" ./config -fPIC -static --debug zlib no-zlib-dynamic --prefix=$HOME/<project_path>/openssl/openssl_debug_64bit_static-linux enable-ssl2 enable-ssl3 enable-ssl3-method no-shared no-threads --with-zlib-lib=/usr/local/lib --with-zlib-include=/usr/local/include make V=1 make test make install
这里重点是添加--with-zlib-lib和--with-zlib-include参数,确保OpenSSL能找到你安装的静态zlib。
步骤2:调整项目链接顺序
链接你的项目时,必须保证zlib库放在OpenSSL库之后。链接器是按从左到右的顺序解析符号的,被依赖的库要放在依赖它的库后面。比如:
gcc your_source_files.c \ -L$HOME/<project_path>/openssl/openssl_debug_64bit_static-linux/lib \ -lssl -lcrypto \ -L/usr/local/lib \ -lz -ldl
这样链接器在处理libcrypto.a中的未定义符号时,能在后面的libz.a中找到对应的定义。
步骤3:验证curl的编译(可选)
虽然你提到curl测试有几个失败,但如果后续使用curl时也遇到类似问题,编译curl时同样要确保zlib路径被正确识别,可以在curl的configure命令中添加--with-zlib=/usr/local参数:
cd $HOME/software/curl-7.57.0 make clean LIBS="-lssl -lcrypto -lz -ldl" ./configure --disable-shared --with-ssl=$HOME/<project_path>/openssl/openssl_debug_64bit_static-linux --enable-debug --prefix=$HOME/<project_path>/libcurl64-linux/debug/ --without-librtmp --without-ca-bundle --disable-ldap --disable-pthreads --disable-threaded-resolver --enable-static --with-zlib=/usr/local make V=1 make install
内容的提问来源于stack exchange,提问作者jjimenezg93




