提问人:user9398723 提问时间:2/23/2018 最后编辑:user9398723 更新时间:2/24/2018 访问量:800
Crypto++在Qt Creator中导致未定义的引用,但在code::blocks中则不然
Crypto++ causes undefined reference in Qt Creator, but not in code::blocks
问:
Crypto++的几乎每个函数都会在Qt Creator中产生未定义的引用,但是code::blocks运行得很好。
LIBS+= -lcryptopp
在 .pro 文件中似乎可以工作,因为除非构造函数重载,否则我可以包含所需的文件并声明变量。
例如
CryptoPP::Integer integer;
std::string str=CryptoPP::IntToString(integer, 10);
抛出
.../main.cpp:54: undefined reference to `std::string CryptoPP::IntToString<CryptoPP::Integer>(CryptoPP::Integer, unsigned int)'
collect2: error: ld returned 1 exit status
make: *** [PDBM] Error 1
07:10:21: The process "/usr/bin/make" exited with code 2.
<a href="https://pastebin.com/c9nWekZR">cryptest.pro</a>
<a href="https://pastebin.com/0ku8Dncw">Makefile</a>
<a href="https://pastebin.com/ii1AM1Dx">full rebuild</a> //sorry, stackoverflow wants those links to be a code
/usr/lib/ 包含 libcrypto++.a、libcrypto++.so、libcryptopp.so 并链接到名为 libcryptopp.a 的 libcrypto++.a
新发现:我以前尝试编译此库,现在我的项目文件夹在cryptopp文件夹中包含所有.h和.cpp文件。为了提供所有代码而不显示代码,已创建新项目并出现更多错误:
In file included from /usr/include/cryptopp/secblock.h:7:0,
from /usr/include/cryptopp/integer.h:7,
from ../cryptest/main.cpp:7:
/usr/include/cryptopp/misc.h: In instantiation of ‘std::string CryptoPP::IntToString(T, unsigned int) [with T = CryptoPP::Integer; std::string = std::basic_string<char>]’:
../cryptest/main.cpp:54:54: required from here
/usr/include/cryptopp/misc.h:424:58: error: invalid cast from type ‘CryptoPP::Integer’ to type ‘char’
result = char((digit < 10 ? '0' : ('a' - 10)) + digit) + result;
^
Makefile:1113: recipe for target 'main.o' failed
这意味着cryptopp一直在使用这些新的.h文件。因此,正如我之前认为的那样,这不仅仅是链接器的问题。
我在 Ubuntu 16.04 上使用 Qt 5.8 和存储库中的 Crypto++。
答:
1赞
JKSH
2/23/2018
#1
-lcryptopp
此选项只是告诉链接器您要链接到名为 的共享库。但是,它不会告诉链接器在何处查找共享库。libcryptopp.so
您必须使用 选项指定包含开发人员的库副本的文件夹。例如,如果库位于 /usr/lib 中,则这样写:-L
LIBS += -L/usr/lib/ -lcryptopp
评论
1赞
jww
2/23/2018
另一种选择是 .这将使用到库的静态链接,并可能避免与路径问题相关的下一组问题。使用静态链接并避免路径问题的另一种方法是 。另请参见 ld(1)
手册页OBJECTS += /usr/lib/libcryptopp.a
LIBS += -L/usr/lib/ -l:libcryptopp.a
0赞
user9398723
2/23/2018
我已经尝试将此补丁添加到 LIBS 和 libcryptopp.a 添加到 OBJECTS,没有任何变化。当我回到家时,我会尝试第二种选择。
0赞
JKSH
3/1/2018
@user9398723只是一个例子。您需要找出libcryptopp在计算机中的正确位置。另外,请记住在编辑 .pro 文件后重新运行 qmake,以便更新 Makefile。/usr/lib/
评论
std::string str=CryptoPP::IntToString<Integer>(integer, 10);
相对较新。它是在 Crypto++ 6.0 中添加的。听起来您在 Qt 项目中链接到的是一个提供的旧发行版;而不是你正在建造的新。这是有道理的,因为你的编译路径包括(新头),但你的链接路径不包括(新库)。因此,请添加到您的Qt链接器标志中。或者,代替 ,使用完整的 .libcryptopp.a
-I/usr/local/include
-L/usr/local/lib
-L/usr/local/lib
-l:libcryptopp.a
/usr/local/lib/libcryptopp.a