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

时间:2013-04-26 12:47:04

标签: c++ linker g++ libcrypto

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

据我了解,解决此问题的常用方法是静态链接其他系统不支持的库,在我的案例中libstdcboostcrypto++

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

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)

1 个答案:

答案 0 :(得分:3)

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

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

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