无法链接OpenSSL代码

我正在尝试构build一个openssl简单的程序。 这里是完整的代码:

#include <stdio.h> #include <stdlib.h> #include <string.h> #include "openssl/aes.h" int main(int argc, char* argv[]) { AES_KEY aesKey_; unsigned char userKey_[16]; unsigned char in_[16]; unsigned char out_[16]; strcpy(userKey_,"0123456789123456"); strcpy(in_,"0123456789123456"); fprintf(stdout,"Original message: %s", in_); AES_set_encrypt_key(userKey_, 128, &aesKey_); AES_encrypt(in_, out_, &aesKey_); AES_set_decrypt_key(userKey_, 128, &aesKey_); AES_decrypt(out_, in_,&aesKey_); fprintf(stdout,"Recovered Original message: %s", in_); return 0; } 

我尝试使用这个命令来编译它:

 gcc -I/home/aleksei/openSSL0.9.8/include -o app -L . -lssl -lcrypto tema1.c 

我得到这个:

  /tmp/ccT1XMid.o: In function `main': tema1.c:(.text+0x8d): undefined reference to `AES_set_encrypt_key' tema1.c:(.text+0xa7): undefined reference to `AES_encrypt' tema1.c:(.text+0xbf): undefined reference to `AES_set_decrypt_key' tema1.c:(.text+0xd9): undefined reference to `AES_decrypt' collect2: ld returned 1 exit status 

我在Ubuntu 10.04下。 我怎样才能使这个工作?

Solutions Collecting From Web of "无法链接OpenSSL代码"

您可能试图静态链接,但-L选项和-lcrypto正在寻找一个文件来动态链接。 要静态链接到特定的库,只需在所有源文件之后的编译器命令行中指定.a文件即可。

例如,

 gcc -I/home/aleksei/openSSL0.9.8/include -o app tema1.c ./libcrypto.a 

对于那些有同样问题但是使用Windows的人,Mingw和OpenSSL for Windows(此时为:Win32 OpenSSL v1.0.2a) 。 您需要链接到位于C:\OpenSSL-Win32\lib\MinGW\ (安装OpenSSL之后)的libeay32.a

在我的情况下,我使用CMake和强大的CLion IDE ,所以我不得不将库重命名为libeay32.dll.a因为CMake没有定位库。 这是我的CMakeLists.txt:

 cmake_minimum_required(VERSION 3.1) project(openssl_1_0_2a) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") include_directories(C:\\OpenSSL-Win32\\include) set(SOURCE_FILES main.cpp) link_directories(C:\\OpenSSL-Win32\\lib\\MinGW) add_executable(openssl_1_0_2a ${SOURCE_FILES}) target_link_libraries(openssl_1_0_2a eay32) 

我用这个例子(这是从这个答案借来的)做了测试:

 #include <stdio.h> #include <stdlib.h> #include <string.h> #include "openssl/aes.h" int main(int argc, char* argv[]) { AES_KEY aesKey_; unsigned char userKey_[16]; unsigned char in_[16] = {0}; unsigned char out_[16] = {0}; strcpy((char *) userKey_,"0123456789123456"); strcpy((char *) in_,"0123456789123456"); fprintf(stdout,"Original message: %s\n", in_); AES_set_encrypt_key(userKey_, 128, &aesKey_); AES_encrypt(in_, out_, &aesKey_); AES_set_decrypt_key(userKey_, 128, &aesKey_); AES_decrypt(out_, in_,&aesKey_); fprintf(stdout,"Recovered Original message: %s XXX \n", in_); return 0; }