Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用g++;_C++_Linux_Openssl_G++ - Fatal编程技术网

C++ 使用g++;

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

我静态编译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 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架构,而不是二进制位)