【问题标题】:Can't link C++ project with openssl static libraries无法将 C++ 项目与 openssl 静态库链接
【发布时间】:2017-11-25 11:17:53
【问题描述】:

我在 C++ 上完成了一些项目,我需要为 Windows XP 及更高版本编译它。

这是我的 RsaEncryptor 类的头文件(我认为在这里发布源代码没有关系,因为我确信它 100% 可以正常工作,但如果需要我可以做到):

#ifndef RSAENCRYPTOR_H_
#define RSAENCRYPTOR_H_

#include <stdexcept>
#include <openssl/rsa.h>
#include <openssl/engine.h>
#include <openssl/pem.h>

// One of this paddings can be used
//#define PADDING RSA_PKCS1_OAEP_PADDING
#define PADDING RSA_PKCS1_PADDING
//#define PADDING RSA_NO_PADDING

class RsaEncryptor {

private:

    RSA* publicKey;
    RSA* privateKey;

public:

    RsaEncryptor() {
        publicKey = nullptr;
        privateKey = nullptr;
    }

    ~RsaEncryptor() {
        if ( this->publicKey )
            RSA_free( this->publicKey );
        if ( this->privateKey )
            RSA_free( this->privateKey );
    }

    size_t GetCipherBytesCount() {
        return 172; //is default for 1024 bit key length
    }

    void SetPublicKeyFromString(const std::string& content);
    void SetPrivateKeyFromString(const std::string& content);

    std::string Encrypt(const std::string& plainData);
    std::string Decrypt(const std::string& cipherData);

};


#endif /* RSAENCRYPTOR_H_ */

我使用最新版本的Eclipse NeonWindows 10 x64 机器上进行C++ 开发。

我也看过this

(...) 在为 Windows XP 或 Vista 构建 OpenSSL 1.1.0 及更高版本时,您需要使用 no-async 进行配置

我是在following 的指导下进行的。

我做了什么:

  1. Windows 10 x64下的Virtual Box中安装Ubuntu 17.04 x64

  2. Ubuntu下载最新版本的OpenSSL库

  3. 安装mxe 和所有要求(但不能用它编译,我决定使用mingw32

  4. 通过root@user-pc:/home/user# apt-get install gcc-mingw-w64-i686安装mingw32

  5. 解压/home/user/openssl-x32中的OpenSSL库

  6. 转到/home/user/openssl-x32

  7. 运行./Configure mingw --cross-compile-prefix=i686-w64-mingw32 --prefix=/home/user/builds/openssl-x32-static no-shared no-async

  8. 运行make

  9. 运行make install

  10. libssl.alibcrypto.a/home/user/builds/openssl-x32-static/lib复制到主机(Windows 10 x64)到文件夹E:\MyProjects\my-app\libraries\

  11. include 目录从Ubuntu 复制到文件夹E:\MyProjects\my-app\include 中的主机

  12. libraries 文件夹添加到链接器配置

  13. include 文件夹添加到编译器配置

  14. 然后,我构建我的项目并得到以下答案:

11:58:09 **** 重新构建项目应用程序的配置调试 **** 信息:配置“调试”使用工具链“MinGW GCC”,即 在这个系统上不受支持,无论如何都试图构建。信息:内部 Builder 用于构建 g++ "-IC:\MyProjects\my-app\include" -O0 -g3 -Wall -c -std=c++11 -m32 -o RsaEncryptor.o "..\RsaEncryptor.cpp" g++ "-IC:\MyProjects\my-app\include" -O0 -g3 -Wall -c -std=c++11 -m32 -o main.o "..\main.cpp" 在来自 ..\main.cpp:5:0 的文件中:..\FilesFinder.h:在成员中函数'无效 FilesFinder::FindRecursively(const string&, const FilesFilter&)': ..\FilesFinder.h:90:56:警告:有符号和有符号之间的比较 无符号整数表达式 [-Wsign-compare] 而 (destinationContainer.GetElementsCount() >= MAX_ELEMENTS_COUNT) { ^ g++ "-IC:\MyProjects\my-app\include" -O0 -g3 -Wall -c -std=c++11 -m32 -o aes256.o "..\aes256.cpp" g++ "-LC:\MyProjects\my-app\libraries" -static-libgcc -static-libstdc++ -static -lpthread -m32 -o C:/MyProjects/my-app/bin/Debug/app RsaEncryptor.o aes256.o main.o -lssl -lcrypto -lgdi32 C:\MyProjects\my-app\libraries\libcrypto.a(b_addr.o):b_addr.c:(.text+0xaa): 对_imp__getnameinfo@28' C:\MyProjects\my-app\libraries\libcrypto.a(b_addr.o):b_addr.c:(.text+0xe0): undefined reference to_imp__ntohs@4' 的未定义引用 C:\MyProjects\my-app\libraries\libcrypto.a(b_addr.o):b_addr.c:(.text+0x242): 未定义对gai_strerrorW' C:\MyProjects\my-app\libraries\libcrypto.a(b_addr.o):b_addr.c:(.text+0x820): undefined reference to_imp__freeaddrinfo@4' 的引用 C:\MyProjects\my-app\libraries\libcrypto.a(b_addr.o):b_addr.c:(.text+0xb5d): 未定义对_imp__getaddrinfo@16' C:\MyProjects\my-app\libraries\libcrypto.a(b_addr.o):b_addr.c:(.text+0xba2): undefined reference togai_strerrorW' 的引用 C:\MyProjects\my-app\libraries\libcrypto.a(b_sock.o):b_sock.c:(.text+0xd7): 对_imp__WSAStartup@8' C:\MyProjects\my-app\libraries\libcrypto.a(b_sock.o):b_sock.c:(.text+0xe8): undefined reference to_imp__WSAGetLastError@0' 的未定义引用 C:\MyProjects\my-app\libraries\libcrypto.a(b_sock.o):b_sock.c:(.text+0x2c7): 对_imp__WSAStartup@8' C:\MyProjects\my-app\libraries\libcrypto.a(b_sock.o):b_sock.c:(.text+0x2d8): undefined reference to_imp__WSAGetLastError@0' 的未定义引用 C:\MyProjects\my-app\libraries\libcrypto.a(b_sock.o):b_sock.c:(.text+0x3b1): 未定义对_imp__ntohs@4' C:\MyProjects\my-app\libraries\libcrypto.a(b_sock.o):b_sock.c:(.text+0x40c): undefined reference to_imp__getsockopt@20' 的引用 C:\MyProjects\my-app\libraries\libcrypto.a(b_sock.o):b_sock.c:(.text+0x423): 对_imp__WSAGetLastError@0' C:\MyProjects\my-app\libraries\libcrypto.a(b_sock.o):b_sock.c:(.text+0x43c): undefined reference to_imp__gethostbyname@4' 的未定义引用 C:\MyProjects\my-app\libraries\libcrypto.a(b_sock.o):b_sock.c:(.text+0x48b): 对_imp__WSAStartup@8' C:\MyProjects\my-app\libraries\libcrypto.a(b_sock.o):b_sock.c:(.text+0x4a2): undefined reference to_imp__WSAGetLastError@0' 的未定义引用 C:\MyProjects\my-app\libraries\libcrypto.a(b_sock.o):b_sock.c:(.text+0x52c): 未定义对_imp__WSACleanup@0' C:\MyProjects\my-app\libraries\libcrypto.a(b_sock.o):b_sock.c:(.text+0x54d): undefined reference to_imp__ioctlsocket@12' 的引用 C:\MyProjects\my-app\libraries\libcrypto.a(b_sock.o):b_sock.c:(.text+0x563): 对_imp__WSAGetLastError@0' C:\MyProjects\my-app\libraries\libcrypto.a(b_sock.o):b_sock.c:(.text+0x6b7): undefined reference to_imp__WSAStartup@8' 的未定义引用 C:\MyProjects\my-app\libraries\libcrypto.a(b_sock.o):b_sock.c:(.text+0x6c8): 对_imp__WSAGetLastError@0' C:\MyProjects\my-app\libraries\libcrypto.a(b_sock.o):b_sock.c:(.text+0x942): undefined reference to_imp__WSAGetLastError@0' 的未定义引用 C:\MyProjects\my-app\libraries\libcrypto.a(b_sock.o):b_sock.c:(.text+0x9dc): 未定义对_imp__setsockopt@20' C:\MyProjects\my-app\libraries\libcrypto.a(b_sock.o):b_sock.c:(.text+0xa15): undefined reference to_imp__ioctlsocket@12' 的引用 C:\MyProjects\my-app\libraries\libcrypto.a(b_sock.o):b_sock.c:(.text+0xa32): 未定义对_imp__WSAGetLastError@0' C:\MyProjects\my-app\libraries\libcrypto.a(b_sock.o):b_sock.c:(.text+0xaa6): undefined reference to_imp__getsockname@12' 的引用 C:\MyProjects\my-app\libraries\libcrypto.a(b_sock.o):b_sock.c:(.text+0xb22): 未定义对_imp__WSAGetLastError@0' C:\MyProjects\my-app\libraries\libcrypto.a(b_sock2.o):b_sock2.c:(.text+0x27): undefined reference to_imp__socket@12' 的引用 C:\MyProjects\my-app\libraries\libcrypto.a(b_sock2.o):b_sock2.c:(.text+0x4e): 未定义对_imp__WSAGetLastError@0' C:\MyProjects\my-app\libraries\libcrypto.a(b_sock2.o):b_sock2.c:(.text+0x120): undefined reference to_imp__setsockopt@20' 的引用 C:\MyProjects\my-app\libraries\libcrypto.a(b_sock2.o):b_sock2.c:(.text+0x15b): 未定义对_imp__connect@12' C:\MyProjects\my-app\libraries\libcrypto.a(b_sock2.o):b_sock2.c:(.text+0x1f5): undefined reference to_imp__setsockopt@20' 的引用 C:\MyProjects\my-app\libraries\libcrypto.a(b_sock2.o):b_sock2.c:(.text+0x206): 对_imp__WSAGetLastError@0' C:\MyProjects\my-app\libraries\libcrypto.a(b_sock2.o):b_sock2.c:(.text+0x265): undefined reference to_imp__WSAGetLastError@0' 的未定义引用 C:\MyProjects\my-app\libraries\libcrypto.a(b_sock2.o):b_sock2.c:(.text+0x2c6): 未定义对_imp__WSAGetLastError@0' C:\MyProjects\my-app\libraries\libcrypto.a(b_sock2.o):b_sock2.c:(.text+0x377): undefined reference to_imp__getsockopt@20' 的引用 C:\MyProjects\my-app\libraries\libcrypto.a(b_sock2.o):b_sock2.c:(.text+0x38f): 未定义对_imp__WSAGetLastError@0' C:\MyProjects\my-app\libraries\libcrypto.a(b_sock2.o):b_sock2.c:(.text+0x4a7): undefined reference to_imp__setsockopt@20' 的引用 C:\MyProjects\my-app\libraries\libcrypto.a(b_sock2.o):b_sock2.c:(.text+0x4b4): 未定义对_imp__WSAGetLastError@0' C:\MyProjects\my-app\libraries\libcrypto.a(b_sock2.o):b_sock2.c:(.text+0x53a): undefined reference to_imp__bind@12' 的引用 C:\MyProjects\my-app\libraries\libcrypto.a(b_sock2.o):b_sock2.c:(.text+0x55f): 未定义对_imp__listen@8' C:\MyProjects\my-app\libraries\libcrypto.a(b_sock2.o):b_sock2.c:(.text+0x5a5): undefined reference to_imp__setsockopt@20' 的引用 C:\MyProjects\my-app\libraries\libcrypto.a(b_sock2.o):b_sock2.c:(.text+0x5b6): 未定义对_imp__WSAGetLastError@0' C:\MyProjects\my-app\libraries\libcrypto.a(b_sock2.o):b_sock2.c:(.text+0x63a): undefined reference to_imp__setsockopt@20' 的引用 C:\MyProjects\my-app\libraries\libcrypto.a(b_sock2.o):b_sock2.c:(.text+0x64b): 对_imp__WSAGetLastError@0' C:\MyProjects\my-app\libraries\libcrypto.a(b_sock2.o):b_sock2.c:(.text+0x6b2): undefined reference to_imp__WSAGetLastError@0' 的未定义引用 C:\MyProjects\my-app\libraries\libcrypto.a(b_sock2.o):b_sock2.c:(.text+0x713): 未定义对_imp__WSAGetLastError@0' C:\MyProjects\my-app\libraries\libcrypto.a(b_sock2.o):b_sock2.c:(.text+0x7a6): undefined reference to_imp__accept@12' 的引用 C:\MyProjects\my-app\libraries\libcrypto.a(b_sock2.o):b_sock2.c:(.text+0x7e7): 对_imp__WSAGetLastError@0' C:\MyProjects\my-app\libraries\libcrypto.a(b_sock2.o):b_sock2.c:(.text+0x84b): undefined reference to_imp__closesocket@4' 的未定义引用 C:\MyProjects\my-app\libraries\libcrypto.a(b_sock2.o):b_sock2.c:(.text+0x86c): 对_imp__closesocket@4' C:\MyProjects\my-app\libraries\libcrypto.a(bss_sock.o):bss_sock.c:(.text+0x1b1): undefined reference to_imp__WSASetLastError@4' 的未定义引用 C:\MyProjects\my-app\libraries\libcrypto.a(bss_sock.o):bss_sock.c:(.text+0x1d0): 对_imp__send@16' C:\MyProjects\my-app\libraries\libcrypto.a(bss_sock.o):bss_sock.c:(.text+0x20a): undefined reference to_imp__WSAGetLastError@0' 的未定义引用 C:\MyProjects\my-app\libraries\libcrypto.a(bss_sock.o):bss_sock.c:(.text+0x272): 对_imp__WSASetLastError@4' C:\MyProjects\my-app\libraries\libcrypto.a(bss_sock.o):bss_sock.c:(.text+0x299): undefined reference to_imp__send@16' 的未定义引用 C:\MyProjects\my-app\libraries\libcrypto.a(bss_sock.o):bss_sock.c:(.text+0x2ca): 对_imp__WSAGetLastError@0' C:\MyProjects\my-app\libraries\libcrypto.a(bss_sock.o):bss_sock.c:(.text+0x33d): undefined reference to_imp__WSASetLastError@4' 的未定义引用 C:\MyProjects\my-app\libraries\libcrypto.a(bss_sock.o):bss_sock.c:(.text+0x360): 对_imp__recv@16' C:\MyProjects\my-app\libraries\libcrypto.a(bss_sock.o):bss_sock.c:(.text+0x39a): undefined reference to_imp__WSAGetLastError@0' 的未定义引用 C:\MyProjects\my-app\libraries\libcrypto.a(bss_sock.o):bss_sock.c:(.text+0x457): 对_imp__WSAGetLastError@0' c:/programs/mingw_w64_mingw32_gcc_stdthread_win32/bin/../lib/gcc/i686-w64-mingw32/4.8.1/../../../../i686-w64-mingw32/bin/ld.exe: C:\MyProjects\my-app\libraries\libcrypto.a(bss_sock.o): bad reloc address 0x24 in section.rdata' 的未定义引用 c:/programs/mingw_w64_mingw32_gcc_stdthread_win32/bin/../lib/gcc/i686-w64-mingw32/4.8.1/../../../../i686-w64-mingw32/bin/ld.exe: 最终链接失败:collect2.exe 操作无效:错误:ld 返回 1 退出状态

11:58:21 构建完成(耗时 11s.567ms)

我只需要将我完成的 C++ 项目与正确编译(带有标志 no-async)的 OpenSSL 库链接,让它在旧版本的 Windows 下工作。

我很乐意在此问题上获得任何帮助。

【问题讨论】:

  • 您已经标记了 C C++。它们是不同的语言。您应该只标记您需要答案的语言。按照你的问题,我假设你想要 C++ 的答案,所以这次我已经为你删除了 C 标签。

标签: c++ cross-compiling


【解决方案1】:

错误日志中的大多数(如果不是全部)未定义符号都来自 Winsock。尝试使用-lws2_32 链接。

【讨论】:

  • 是的,你是对的:我将它与标志 -lssl -lcrypto -lcrypt32 -lgdi32 -lws2_32 链接,并且链接成功!但是我再次测试了我的应用程序(在 Windows XP 下),它仍然无法正常工作...... :(
猜你喜欢
  • 2015-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多