静态链接到libcrypto++,使用g++

Static linking to libcrypto++, with g++

本文关键字:使用 g++ libcrypto++ 链接 静态      更新时间:2023-10-16

我正在用Debian Wheezy和g++4.7编译一个程序。我希望它能够运行在另一个系统与Debian挤压(没有最近的g++)。我无法在Squeeze上编译程序,因为我使用了旧g++不支持的某些C++11功能,以及新的Boost版本和libcrypto++9。

据我所知,解决这个问题的通常方法是静态链接其他系统不支持的库,在我的情况下是libstdc, boostcrypto++

我的(链接)编译器调用现在是

g++-4.7 .obj/btcmirco.o -Wl,-Bstatic -lboost_program_options -lboost_system -lcrypto++ -Wl,-Bdynamic -lcurl -static-libgcc -std=c++11 -o MyProgram

然而,我似乎错过了一些东西,因为它抛出了很多未定义的引用错误。它工作良好,如果我动态链接到crypto++(只有静态链接libstdcboost)。

谁能告诉我哪里错了,或者我的方法是否有根本错误?

我得到的链接错误是(短):

`.text._ZN8CryptoPP22BufferedTransformationD2Ev' referenced in section `.text._ZN8CryptoPP22BufferedTransformationD1Ev[_ZN8CryptoPP22BufferedTransformationD1Ev]' of /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib/libcrypto++.a(cryptlib.o): defined in discarded section `.text._ZN8CryptoPP22BufferedTransformationD2Ev[_ZN8CryptoPP22BufferedTransformationD5Ev]' of /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib/libcrypto++.a(cryptlib.o)
`.text._ZN8CryptoPP25MessageAuthenticationCodeD2Ev' referenced in section `.text._ZN8CryptoPP25MessageAuthenticationCodeD1Ev[_ZN8CryptoPP25MessageAuthenticationCodeD1Ev]' of /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib/libcrypto++.a(cryptlib.o): defined in discarded section `.text._ZN8CryptoPP25MessageAuthenticationCodeD2Ev[_ZN8CryptoPP25MessageAuthenticationCodeD5Ev]' of /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib/libcrypto++.a(cryptlib.o)

我遇到了同样的问题,这与您试图将由g++-4.7(您的程序)生成的代码与以前版本的g++ (cryptopp库)生成的代码混合在一起有关。

这背后的原因是,当您执行编译库执行make命令时,它使用为您的系统设置的默认版本的g++,通常是操作系统附带的。

为了解决问题,你应该做的是用g++-4.7编译cryptopp库。为此,通过执行make CXX=g++-4.7编译库。生成的静态库在与您的代码链接时不应该给您错误。