4

我正在尝试使用 Debian Wheezy 和 g++4.7 在我的系统上编译一个程序。我希望它能够在另一个带有 Debian Squeeze 的系统上运行(并且没有最近的 g++)。我无法在 Squeeze 上编译程序,因为我使用C++11了旧 g++ 不支持的某些功能,以及新的 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)
4

1 回答 1

3

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

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

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

于 2014-01-16T06:04:08.760 回答