Crypto++在Qt Creator中导致未定义的引用,但在code::blocks中则不然

Crypto++ causes undefined reference in Qt Creator, but not in code::blocks

提问人:user9398723 提问时间:2/23/2018 最后编辑:user9398723 更新时间:2/24/2018 访问量:800

问:

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++。

Linux Qt undefined-reference crypto++

评论

1赞 eyllanesc 2/23/2018
您可以提供错误消息,也可以解释CodeBlocks与Qt的关系。
1赞 Murphy 2/23/2018
哪些是未定义的引用?添加逐字链接器输出。
0赞 jww 2/23/2018
显示您的Qt项目文件和错误消息示例。另请参阅在 QT 项目中使用 Crypto++ 静态库、带有 Crypto++ 库的 QT 控制台应用程序、Crypto++ 无法构建 Qt 应用程序、Qt 应用程序中的 Crypto++ 和链接器错误?等。
0赞 user9398723 2/23/2018
Code::Blocks使用相同的编译器(可以是不同的版本,但我在bith上尝试过相同的结果)和相同的cryptopp。主要区别在于 qt 使用 make,而 C::B 不使用。从控制台运行 make 会得到相同的结果。
1赞 jww 2/24/2018
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

答:

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.aLIBS += -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/