9

今日から、RSA 用の openSSL API を調べ始めました。それは簡単なコードです:

#include<stdio.h>
#include<openssl/rsa.h>
#include<openssl/engine.h>
int main() {
    RSA *rsa;
    rsa = RSA_new_();
    RSA_free(rsa);
    return 0;
}

そして私はコンパイルしています

gcc -I /usr/local/ssl/include -o など

しかし、gcc は RSA_new と RSA_free への参照を定義していないというエラーを返します。rsa.h ヘッダーを確認しましたが、この 2 つの関数への参照はありません。どうしたの?私はopensslウェブサイトのリファレンスガイドに従っています...

編集: gcc 出力:

gcc -I /usr/local/ssl/include/ -o rsa rsa.c -L/usr/local/ssl/lib -lcrypto /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): 関数内dlfcn_globallookup': dso_dlfcn.c:(.text+0x1d): undefined reference todlopen' dso_dlfcn.c:(.text+0x33): dlclose への未定義の参照dlsym' dso_dlfcn.c:(.text+0x3d): undefined reference to' /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): 関数dlfcn_bind_func': dso_dlfcn.c:(.text+0x3b1): undefined reference to内 dlsym' dso_dlfcn.c:(.text+0x490) : dlfcn_bind_var' への未定義の参照dlerror' /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function: dso_dlfcn.c:(.text+0x511): dlsym' dso_dlfcn.c:(.text+0x5f0): undefined reference todlerror への未定義の参照' /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): 関数dlfcn_load': dso_dlfcn.c:(.text+0x667): undefined reference to内 dlopen' dso_dlfcn.c:( .text+0x6de): dlclose' dso_dlfcn.c:(.text+0x715): undefined reference todlerror への未定義の参照' /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): 関数dlfcn_pathbyaddr': dso_dlfcn.c:(.text+0x7b1): undefined reference to内 dladdr' dso_dlfcn.c:(.text+0x819): への未定義の参照dlerror' /usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In functiondlfcn_unload': dso_dlfcn.c:(.text+0x87a): `dlclose' への未定義の参照 collect2: ld が 1 つの終了ステータスを返しました

4

5 に答える 5

5

問題は、あなたが とリンクしていて、 のlibssl一部である RSA 暗号を使用していることですlibcrypto。別のエラー : there is no function called : RSA_new_:

toc@UnixServer:/usr/include/openssl$ grep RSA_new *
rsa.h:RSA * RSA_new(void);
rsa.h:RSA * RSA_new_method(ENGINE *engine);

だからあなたのコードを修正してください:

rsa = RSA_new();

そして、そのようにコンパイルします:

gcc -I/usr/include/openssl/ -Wall my_rsa.c -o my_rsa  -lcrypto

EDIT:最後のエラー(dl関数):

gcc -I/usr/include/openssl/ -Wall my_rsa.c -o my_rsa  -lcrypto -ldl
于 2012-08-17T16:17:11.800 に答える
3

ライブラリともリンクする必要があります。

gcc -I/usr/local/ssl/include -o etc etc.c -L/usr/local/lib -lssl

この-Lオプションは、GCCにライブラリファイルを探す場所を指示し、-l(小さいL)はリンカーにライブラリとリンクする必要があることを指示します。

ライブラリフォルダとライブラリ名を取得したものに置き換えます。

于 2012-08-17T15:49:35.847 に答える
2

libSSLライブラリに対してリンクする必要があります。何かのようなもの

gcc -I /usr/local/ssl/include -o myprog myprog.c -lssl

トリックを行います。

(多分それは実際にはそうではありません-lssl-lopenssl-lssl-rsaまたは何でもです;あなたはタイプすることによってこれを見つけることができます

pkg-config --libs PACKAGENAME

ここで、PACKAGENAMEは、libssl、openssl、libssl-dev、openssl-develなどを含むパッケージの名前です。)

于 2012-08-17T15:48:54.173 に答える
2

追加する必要があります-lsslRSA_new「未定義の参照」は、との実際の実装を探しているリンカーによって生成されますRSA_free。これらの関数はopensslライブラリのどこかにあり-lssl、リンカにそれらがどこにあるかを知らせます。

編集:ヘッダーファイルに何か問題がある場合は、「識別子RSA_newの暗黙の宣言」のようなエラーが表示されます。しかし、特定のフラグがその種のエラーを持つようにする必要があります(私は思っ-Wmissing-prototypesた)。

于 2012-08-17T15:49:26.297 に答える
0

CMakeLists.txt を使用する場合は、次の簡単なコマンドを追加する必要があります。

link_libraries(ssl  crypto)
于 2017-04-14T09:36:53.743 に答える