🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

2145閲覧

cryptoppのリンク

BeatStar

総合スコア4962

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/09/25 01:59

編集2019/09/27 02:35

趣味でC++やっています。

http://www.cryptopp.com だったか、GitHubの方だったか忘れましたが、
cryptopp というライブラリを使いたいと思い、試しています。

Windows上で基本的にMinGWを使っています。
cryptoppのmakefileを動かしてもどうやらUNIX系じゃないといけないようで、

GnupackというやつをわざわざDLして、
これでlib*.aにしました。 ( Gnupack 上で "make" と打っただけ... )

そのライブラリをMinGWでリンクして使おうとしたところ、
リンケージエラーになってしまいました。

コードは(まずはコンパイルできないと話にならないので)サンプルとして
http://yut.hatenablog.com/entry/20131115/1384471222 辺りをそのまま使いました。

ディレクトリを /.../ で表現すると

/project1/ + /cryptopp/ + rsa.h 等 ( そのままディレクトリごと移動しただけ ) ... + sample.cpp + compile.bat

としています。( compile.batはmakefileみたいな使い方... )

オプションは、

g++ -o sample.exe sample.cpp -L./cryptopp/ -lcryptopp -I./cryptopp/ -static-libgcc -static-libstdc++ -static -lpthread

とやったところ、

C:(略)\AppData\Local\Temp\ccDSznBF.o:sample.cpp:(.text+0x17a): undefined reference to `CryptoPP::StringSinkTemplate<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::StringSinkTemplate(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&)' C:(略)\AppData\Local\Temp\ccDSznBF.o:sample.cpp:(.text+0x354): undefined reference to `CryptoPP::StringSinkTemplate<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::StringSinkTemplate(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&)' C:(略)\AppData\Local\Temp\ccDSznBF.o:sample.cpp:(.rdata$_ZTVN8CryptoPP16BlockCipherFinalILNS_9CipherDirE1ENS_8Rijndael3DecEEE[__ZTVN8CryptoPP16BlockCipherFinalILNS_9CipherDirE1ENS_8Rijndael3DecEEE]+0x50): undefined reference to `CryptoPP::Rijndael::Base::AlgorithmProvider[abi:cxx11]() const' C:(略)\AppData\Local\Temp\ccDSznBF.o:sample.cpp:(.rdata$_ZTVN8CryptoPP16BlockCipherFinalILNS_9CipherDirE1ENS_8Rijndael3DecEEE[__ZTVN8CryptoPP16BlockCipherFinalILNS_9CipherDirE1ENS_8Rijndael3DecEEE]+0x80): undefined reference to `non-virtual thunk to CryptoPP::Rijndael::Base::AlgorithmProvider[abi:cxx11]() const' C:(略)\AppData\Local\Temp\ccDSznBF.o:sample.cpp:(.rdata$_ZTVN8CryptoPP12ClonableImplINS_16BlockCipherFinalILNS_9CipherDirE1ENS_8Rijndael3DecEEES4_EE[__ZTVN8CryptoPP12ClonableImplINS_16BlockCipherFinalILNS_9CipherDirE1ENS_8Rijndael3DecEEES4_EE]+0x50): undefined reference to `CryptoPP::Rijndael::Base::AlgorithmProvider[abi:cxx11]() const' C:(略)\AppData\Local\Temp\ccDSznBF.o:sample.cpp:(.rdata$_ZTVN8CryptoPP12ClonableImplINS_16BlockCipherFinalILNS_9CipherDirE1ENS_8Rijndael3DecEEES4_EE[__ZTVN8CryptoPP12ClonableImplINS_16BlockCipherFinalILNS_9CipherDirE1ENS_8Rijndael3DecEEES4_EE]+0x7c): undefined reference to `non-virtual thunk to CryptoPP::Rijndael::Base::AlgorithmProvider[abi:cxx11]() const' C:(略)\AppData\Local\Temp\ccDSznBF.o:sample.cpp:(.rdata$_ZTVN8CryptoPP16BlockCipherFinalILNS_9CipherDirE0ENS_8Rijndael3EncEEE[__ZTVN8CryptoPP16BlockCipherFinalILNS_9CipherDirE0ENS_8Rijndael3EncEEE]+0x50): undefined reference to `CryptoPP::Rijndael::Base::AlgorithmProvider[abi:cxx11]() const' C:(略)\AppData\Local\Temp\ccDSznBF.o:sample.cpp:(.rdata$_ZTVN8CryptoPP16BlockCipherFinalILNS_9CipherDirE0ENS_8Rijndael3EncEEE[__ZTVN8CryptoPP16BlockCipherFinalILNS_9CipherDirE0ENS_8Rijndael3EncEEE]+0x80): undefined reference to `non-virtual thunk to CryptoPP::Rijndael::Base::AlgorithmProvider[abi:cxx11]() const' C:(略)\AppData\Local\Temp\ccDSznBF.o:sample.cpp:(.rdata$_ZTVN8CryptoPP12ClonableImplINS_16BlockCipherFinalILNS_9CipherDirE0ENS_8Rijndael3EncEEES4_EE[__ZTVN8CryptoPP12ClonableImplINS_16BlockCipherFinalILNS_9CipherDirE0ENS_8Rijndael3EncEEES4_EE]+0x50): undefined reference to `CryptoPP::Rijndael::Base::AlgorithmProvider[abi:cxx11]() const' C:(略)\AppData\Local\Temp\ccDSznBF.o:sample.cpp:(.rdata$_ZTVN8CryptoPP12ClonableImplINS_16BlockCipherFinalILNS_9CipherDirE0ENS_8Rijndael3EncEEES4_EE[__ZTVN8CryptoPP12ClonableImplINS_16BlockCipherFinalILNS_9CipherDirE0ENS_8Rijndael3EncEEES4_EE]+0x7c): undefined reference to `non-virtual thunk to CryptoPP::Rijndael::Base::AlgorithmProvider[abi:cxx11]() const' ./cryptopp/\libcryptopp.a(cryptlib.o): In function `ZN8CryptoPP12TheBitBucketEv': /desktop/check/cryptopp-master/cryptopp-master/cryptlib.cpp:42: undefined reference to `__dso_handle' /desktop/check/cryptopp-master/cryptopp-master/cryptlib.cpp:42: undefined reference to `__cxa_atexit' ./cryptopp/\libcryptopp.a(cryptlib.o):/desktop/check/cryptopp-master/cryptopp-master/cryptlib.cpp:42: undefined reference to `__dso_handle' ./cryptopp/\libcryptopp.a(cryptlib.o):/desktop/check/cryptopp-master/cryptopp-master/cryptlib.cpp:42: undefined reference to `__cxa_atexit' ./cryptopp/\libcryptopp.a(cryptlib.o):/desktop/check/cryptopp-master/cryptopp-master/cryptlib.cpp:42: undefined reference to `__dso_handle' ./cryptopp/\libcryptopp.a(cryptlib.o):/desktop/check/cryptopp-master/cryptopp-master/cryptlib.cpp:42: undefined reference to `__cxa_atexit' ./cryptopp/\libcryptopp.a(cryptlib.o):/desktop/check/cryptopp-master/cryptopp-master/cryptlib.cpp:42: undefined reference to `__dso_handle' ./cryptopp/\libcryptopp.a(cryptlib.o):/desktop/check/cryptopp-master/cryptopp-master/cryptlib.cpp:42: undefined reference to `__cxa_atexit' ./cryptopp/\libcryptopp.a(cryptlib.o):/desktop/check/cryptopp-master/cryptopp-master/cryptlib.cpp:42: undefined reference to `__dso_handle' ./cryptopp/\libcryptopp.a(cryptlib.o):/desktop/check/cryptopp-master/cryptopp-master/cryptlib.cpp:42: undefined reference to `__cxa_atexit' ./cryptopp/\libcryptopp.a(cryptlib.o):/desktop/check/cryptopp-master/cryptopp-master/cryptlib.cpp:42: undefined reference to `__dso_handle' ./cryptopp/\libcryptopp.a(cryptlib.o):/desktop/check/cryptopp-master/cryptopp-master/cryptlib.cpp:42: undefined reference to `__cxa_atexit' ./cryptopp/\libcryptopp.a(cryptlib.o):/desktop/check/cryptopp-master/cryptopp-master/cryptlib.cpp:42: undefined reference to `__dso_handle' ./cryptopp/\libcryptopp.a(cryptlib.o):/desktop/check/cryptopp-master/cryptopp-master/cryptlib.cpp:42: undefined reference to `__cxa_atexit' ./cryptopp/\libcryptopp.a(cryptlib.o):/desktop/check/cryptopp-master/cryptopp-master/cryptlib.cpp:42: undefined reference to `__dso_handle' ./cryptopp/\libcryptopp.a(cryptlib.o):/desktop/check/cryptopp-master/cryptopp-master/cryptlib.cpp:42: undefined reference to `__cxa_atexit' ./cryptopp/\libcryptopp.a(cryptlib.o):/desktop/check/cryptopp-master/cryptopp-master/cryptlib.cpp:42: undefined reference to `__dso_handle' ./cryptopp/\libcryptopp.a(cryptlib.o):/desktop/check/cryptopp-master/cryptopp-master/cryptlib.cpp:42: undefined reference to `__cxa_atexit' ./cryptopp/\libcryptopp.a(cryptlib.o): In function `ZN8CryptoPP7NullRNGEv': /desktop/check/cryptopp-master/cryptopp-master/cryptlib.cpp:402: undefined reference to `__dso_handle' /desktop/check/cryptopp-master/cryptopp-master/cryptlib.cpp:402: undefined reference to `__cxa_atexit' ./cryptopp/\libcryptopp.a(cryptlib.o):/desktop/check/cryptopp-master/cryptopp-master/cryptlib.cpp:42: undefined reference to `__dso_handle' ./cryptopp/\libcryptopp.a(cryptlib.o):/desktop/check/cryptopp-master/cryptopp-master/cryptlib.cpp:42: undefined reference to `__cxa_atexit' ./cryptopp/\libcryptopp.a(cryptlib.o):/desktop/check/cryptopp-master/cryptopp-master/cryptlib.cpp:42: undefined reference to `__dso_handle' ./cryptopp/\libcryptopp.a(cryptlib.o):/desktop/check/cryptopp-master/cryptopp-master/cryptlib.cpp:42: undefined reference to `__cxa_atexit' ./cryptopp/\libcryptopp.a(cryptlib.o):/desktop/check/cryptopp-master/cryptopp-master/cryptlib.cpp:42: undefined reference to `__dso_handle' (まだあるが大体同じようなメッセージが続く.ただしファイル名が違うが...)

という風に(経験的に)リンケージエラーなのはわかりますが、
sample.exe を作るときに -I でインクルードするためのディレクトリ指定, -L でリンクすべきライブラリのエリア指定...としているはずですが...

メッセージを読むとtemplate辺りがインクルードされていないような…

インクルード及びリンクしているはずなのに…

何か忘れているのでしょうか? (リンクし忘れや、オプション忘れ)

あまりmakefile使わない(軽く触っただけ..)ので、お手柔らかにお願いいたします。

[情報]
OS: Windows系 ( 10 etc. )
言語: C++
基本的なコンパイラ: MinGW (g++ 8.1.0)
ライブラリをコンパイルするために使ったもの: Gnupack (gnupack-pretest_devel-2018.11.25)
使いたいライブラリ: cryptopp


[追記1]

外出先からだったので、帰宅後、試してみました。

y_waiwaiさんのおっしゃるように、ar -t <ライブラリ> でチェックしてみました。
一応、必要なものは入っていました。
しかし、それでも...ということで、「GNUPackでsample.exeにしてみたらどうだろうか」
と思い、ほぼ同じコマンドライン引数でコンパイルしたところ、
うまくいきました。(コンパイルエラー,リンケージエラー、共に無し)

libcryptopp.a を DLLにリンクして サンプルコードのmain関数を別の関数として
(適当な名前でrunEx関数とした)やって、動的リンクを行いました。

DLLはGNUPackで、実行ファイルはMinGWでやってみたところ、DLL内の関数にアクセスできず。

実行ファイルもGNUPackでコンパイルしたところ、うまくいきました。(文字化けはするが、
それは別の問題なのでスルー)

VC++でDLLを作り、MinGWで実行ファイルを作ったときのように、マングリング? が違うのかなぁと。

どうにかGNUPackとMinGW で使えないかなぁと...

できれば、基本はMinGWでやりたいのですが...

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

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

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

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

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

guest

回答2

0

ベストアンサー

undefined reference to

ですんで、インクルードが問題なのではなく、ライブラリがきちんとリンクされてないってことです

インクルードに問題があるときは、コンパイル時にエラーが出ます
リンク時のエラーというのは、ライブラリ指定がらみが多いですね

投稿2019/09/25 02:37

y_waiwai

総合スコア88038

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

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

BeatStar

2019/09/25 03:04

ご回答ありがとうございます。 あー、えっと、一応リンケージエラー( リンク不足等によるもの ) だとはわかっていますが、 GNUPack側で libcryptopp.a を生成して、それをリンクしているはずですが、 質問のようなエラーを吐きます。
y_waiwai

2019/09/25 03:14

ならそのライブラリを調べて、エラーのでている関数群が存在してるのかどうか、また、本当にそのライブラリがリンクされているのか、を調べるべきでしょう
BeatStar

2019/09/27 02:35

本文に追記しました
y_waiwai

2019/09/27 02:50

MingwとCygwinでオブジェクトファイルの形式が違う? ってはなしはあんまし聞いたことがないので、双方GCCのバージョンを合わせるなりしてみるとか、ですかねえ
guest

0

(追記のようなものです)

***さんのおっしゃるように、もしかしたらg++のバージョンによるのかもしれません。
質問して後々に考えてみると、「(GNUPack上で)MinGW側のg++を使えばいいのでは?」
という考えに至りました。

しかしながら、GNUPackの方ではg++がすでにあるので、競合しそうで...
(MinGWのg++をmingwg++.exe とリネームしようかと思ったが...)

一応念のため、GNUPackではなく、(本家)Cygwinの方でMinGWの方でやると
うまくいきました。( MinGW側でのコンパイル及び、問題の解決 )

なので、以降はCygwinの方でやろうと思います。

お騒がせしてすみませんでした。

投稿2019/09/29 01:33

BeatStar

総合スコア4962

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問