我正在尝试使用Debian Wheezy和g ++ 4.7在我的系统上编译程序。我希望它能够在Debian Squeeze的另一个系统上运行(并且没有最近的g ++)。我无法在Squeeze上编译程序,因为我使用旧的g ++不支持的某些C++11
功能,以及新的Boost版本和libcrypto ++ 9。
据我了解,解决此问题的常用方法是静态链接其他系统不支持的库,在我的案例中libstdc
,boost
和crypto++
。
我的(链接)编译器调用现在是
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++
(并且只有静态链接libstdc
和boost
),它就可以正常工作。
任何人都可以告诉我什么是错的,或者我的方法中是否存在根本错误?
我得到的链接器错误(短路):
`.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)
答案 0 :(得分:3)
我遇到了同样的问题,这与您尝试将g ++ - 4.7(您的程序)生成的代码与先前版本的g ++(cryptopp库)生成的代码混合在一起这一事实。
这背后的原因是当你执行编译执行make
命令的库时,它使用为你的系统设置的默认版本g++
,通常是操作系统附带的版本。 / p>
为了解决问题,您应该使用cryptopp
编译g++-4.7
库。
为此,通过执行make CXX=g++-4.7
来编译库。生成的静态库在与代码链接时不应该给出错误。