C++ 使用g++;
我静态编译OpenSSL库。我想用OpenSSL库静态编译C++ 使用g++;,c++,linux,openssl,g++,C++,Linux,Openssl,G++,我静态编译OpenSSL库。我想用OpenSSL库静态编译MyModule。我正在使用Makefile对 LDFLAGS=$(LD_共享_标志)-fPIC-static-lssl-lcrypto 根Makefile中的LD_SHARED_标志 LD_共享_标志=-z文本 当我运行make时,我得到了这个 g++-shared-L.././lib-z text-fPIC-static-lssl-lcrypto-o libMyModule.so debug_utils.o MyModule.o
MyModule
。我正在使用Makefile对
LDFLAGS=$(LD_共享_标志)-fPIC-static-lssl-lcrypto
根Makefile中的LD_SHARED_标志
LD_共享_标志=-z文本
当我运行make时,我得到了这个
g++-shared-L.././lib-z text-fPIC-static-lssl-lcrypto-o libMyModule.so debug_utils.o MyModule.o labels.o-L/path_to_openssl/lib-lssl-lcrypto-lc
/usr/bin/ld:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbeginT.o:创建共享对象时,不能使用针对“TMC_END”的重新定位R_x86_64_32;用-fPIC重新编译
/usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbeginT.o:添加符号时出错:错误值
collect2:错误:ld返回了1个退出状态
make:**[libMyModule.so]错误1
我是否为静态编译使用了正确的标志
如何修复此错误?使用-fPIC重建openssl静态库 您似乎想将静态库
libssl.a
和libcrypto.a
链接到您的
共享库libMyModule.so
将GCC选项添加到您的linkage命令中并不具有这种效果,
但是一个更大的。它的作用是请求一个完全静态的链接。链接器必须找到并使用
所有必需库的静态版本:不仅仅是您在
链接命令,但也包括默认命令:libc
、libstdc++
、libgcc
,以及静态链接
C运行时的变体支持二进制文件,crt*.o
也许,你不想要所有的-静态的东西,即使你不介意拥有它,
它与-shared
不兼容
当然,要创建共享库,您需要-shared
。链接到的所有对象文件
共享库必须是位置独立的代码,使用-fPIC
编译
您遇到的错误:
/usr/bin/ld: /usr/lib/gcc/x86_64-redhat-linux/4.8.5/crtbeginT.o: \
relocation R_X86_64_32 against `__TMC_END__' can not be used when making a shared object; \
recompile with -fPIC
告诉您链接所需的C运行时二进制文件crtbeginT.o
未使用-fPIC
编译;不是吗
定位独立代码,因此无法链接到共享库
但是通过-static
选项,链接需要crtbeginT.o
。如果你没有
指定-static
,然后将链接crtbeginS.o
,这是的PIC变体
此运行时二进制文件用于链接共享库,并且不会发生错误
所以不要指定-static
。它不会与-shared
混合使用,也不是链接的方式
将libssl
和libcrypto
的静态版本导入libMyModule.so
实现这一目标的方法不止一种。最简单的方法是更换-lssl-lcrypto
在您的linkage命令中,带有明确指定的静态版本的选项
只是那些图书馆,即
-l:libssl.a -l:libcrypto.a
我想你指的是链接,而不是编译。你是否注意到错误消息中关于“使用-fPIC
重新编译”的建议?我不知道R\u X86\u 64\u 32
是什么,但它表明你已经构建并正在链接32位二进制文件。如果在openssl LIB上执行文件…
,它是32还是64?(X86_64是CPU架构,而不是二进制位)