質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

Q&A

解決済

1回答

2106閲覧

C言語のコンパイルのエラー(リンカのエラー)

UGLO

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

0グッド

0クリップ

投稿2020/10/29 10:25

前提・実現したいこと

opensslのライブラリを用いてcmacのサンプルコードをc言語で動かすことが目標です。

発生している問題・エラーメッセージ

>>> gcc -I /usr/local/opt/openssl@1.1/include/ cmac_example.c Undefined symbols for architecture x86_64: "_CMAC_CTX_free", referenced from: _main in cczYkXQ3.o "_CMAC_CTX_new", referenced from: _main in cczYkXQ3.o "_CMAC_Final", referenced from: _main in cczYkXQ3.o "_CMAC_Init", referenced from: _main in cczYkXQ3.o "_CMAC_Update", referenced from: _main in cczYkXQ3.o "_EVP_aes_128_cbc", referenced from: _main in cczYkXQ3.o ld: symbol(s) not found for architecture x86_64 collect2: error: ld returned 1 exit status

動かしたいソースコード

C言語

1// https://gist.github.com/ecerulm/90653daf2b808aea0837 2 3#include <stdio.h> 4#include <openssl/cmac.h> 5 6void printBytes(unsigned char *buf, size_t len) { 7 for(int i=0; i<len; i++) { 8 printf("%02x ", buf[i]); 9 } 10 printf("\n"); 11} 12 13int main(int argc, char *argv[]) 14{ 15 // https://tools.ietf.org/html/rfc4493 16 17 // K, M and T from 18 // http://csrc.nist.gov/publications/nistpubs/800-38B/Updated_CMAC_Examples.pdf 19 // D.1 AES-128 20 21 // K: 2b7e1516 28aed2a6 abf71588 09cf4f3c 22 unsigned char key[] = { 0x2b,0x7e,0x15,0x16, 23 0x28,0xae,0xd2,0xa6, 24 0xab,0xf7,0x15,0x88, 25 0x09,0xcf,0x4f,0x3c}; 26 27 // M: 6bc1bee2 2e409f96 e93d7e11 7393172a Mlen: 128 28 unsigned char message[] = { 0x6b,0xc1,0xbe,0xe2, 29 0x2e,0x40,0x9f,0x96, 30 0xe9,0x3d,0x7e,0x11, 31 0x73,0x93,0x17,0x2a }; 32 33 unsigned char mact[16] = {0}; 34 size_t mactlen; 35 36 CMAC_CTX *ctx = CMAC_CTX_new(); 37 CMAC_Init(ctx, key, 16, EVP_aes_128_cbc(), NULL); 38 printf("message length = %lu bytes (%lu bits)\n",sizeof(message), sizeof(message)*8); 39 40 CMAC_Update(ctx, message, sizeof(message)); 41 CMAC_Final(ctx, mact, &mactlen); 42 43 printBytes(mact, mactlen); 44 /* expected result T = 070a16b4 6b4d4144 f79bdd9d d04a287c */ 45 46 CMAC_CTX_free(ctx); 47 return 0; 48}

試したこと

gccのコンパイルオプションで-I<ディレクトリ>でopensslのディレクトリを指定して、コンパイルは通ったのですが、エラーメッセージが出て、そこから進んでいません。

参考になりそうなものを上げていきます。
・opensslのディレクトリは下のやつです。

>>> where openssl /usr/local/opt/openssl@1.1/bin/openssl /usr/bin/openssl

・cmac.hの場所

[ユーザー名]-[/usr/local/opt/openssl@1.1/include] >>> cd openssl [ユーザー名]-[/usr/local/opt/openssl@1.1/include/openssl] >>> ls .......cmac.h........

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coco_bauer

2020/10/29 11:19

"_CMAC_CTX_free", "_CMAC_CTX_new" といった関数をcmac_example.c から呼び出そうとしていますが、ことごとく not found で撥ねられているようですね。 こうした関数を使うには、これらの関数を定義したC言語のプログラムを用意してコンパイルしてオブジェクトファイルを作成し、cmac_example.cをコンパイルしたオブジェクトファイルとリンクして、実行ファイルを作って、それを実行するという手順をふまなければなりません。 "_CMAC_CTX_free", "_CMAC_CTX_new" といった関数を含むオブジェクトファイルやライブラリが事前に用意できるなら、それをコンパイルの際にライブラリとして指定すれば良いのです。 gccの -I オプションは、includeするファイルの所在場所を指定するものです。ライブラリを使いたいのであれば、-L オプションでライブラリファイルの所在場所をgccに知らせてやる必要があります。 gccは長い歴史のあるコンパイラなので、それを説明している書籍やWebサイトが多数あります。 まずは、gccの使い方を勉強しては如何でしょうか?
UGLO

2020/10/29 11:51

素早い返信ありがとうございます。 https://kamino.hatenablog.com/entry/c%2B%2B-principle-of-build-library#sec3_2 一応上のwebサイトを参考にしてやってみました。 gcc cmac_example.c -I /usr/local/opt/openssl@1.1/include/ -L /usr/local/opt/openssl@1.1/lib -l libcrypto を実行してみたところ、 ld: library not found for -llibcrypto と出ています [ユーザー名]-[/usr/local/opt/openssl@1.1/lib] >>> ls engines-1.1 libcrypto.1.1.dylib libcrypto.a libcrypto.dylib libssl.1.1.dylib libssl.a libssl.dylib pkgconfig -l (エルの小文字) でライブラリの名前を指定するといいみたいなの書いてたのでやってみてもnot foundで ???となっています。
guest

回答1

0

自己解決

下記で解決できました。

gcc -I/usr/local/opt/openssl@1.1/include -L/usr/local/opt/openssl@1.1/lib -lcrypto cmac_example.c

投稿2020/10/29 13:53

UGLO

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問