趣味で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でやりたいのですが...
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/09/25 03:04
2019/09/25 03:14
2019/09/27 02:35
2019/09/27 02:50