makefile 上的 GCC 和 Crypto++

Posted

技术标签:

【中文标题】makefile 上的 GCC 和 Crypto++【英文标题】:GCC and Crypto++ on makefile 【发布时间】:2017-02-18 15:31:10 【问题描述】:

我正在尝试使用 gcc-make 命令编译 C++ 项目,但程序给出了这个错误。我已经编译了 Crypto++ 并添加了 include 和 lib 文件夹,但我不知道如何将此目录添加到 gcc。

我应该怎么做才能修复这个“-lcrytopp”错误?

我正在使用 makefile,这是第 33-34 行。

$(TARGET): build $(OBJECTS)
    $(CC) $(OBJECTS) -o $(TARGET) -lcryptopp

错误

D:\Osman\CnC RA2\Mix\ccmix-crypto\ccmix-crypto>make
g++ src/mix_db_gamedb.o src/mix_db_gmd.o src/mix_header.o src/mix_db_lmd.o
src/mixid.o src/ccmix.o src/mix_file.o -o build/ccmix -lcryptopp
c:/mingw/bin/../lib/gcc/mingw32/5.3.0/../../../../mingw32
/bin/ld.exe: cannot find -lcryptopp
collect2.exe: error: ld returned 1 exit status
Makefile:34: recipe for target 'build/ccmix' failed
make: *** [build/ccmix] Error 1

加密++目录:

编译错误:

【问题讨论】:

请在问题中包含错误 我添加了错误。对不起,错误的图片。 请将您的 makefile 和代码的错误和 minimal reproducible example 添加到问题中作为文本 我添加了 2 行 makefile。因为程序在第 34 行给出错误。make 命令找不到 crytopp 目录和 /include , /lib 子目录。 如前所述,您应该将错误的实际文本剪切并粘贴到问题中,而不是添加错误图片。 【参考方案1】:

您尚未将包含该库的目录添加到您的链接行。它应该类似于-Lxxx,其中xxx 是包含cryptopp 库的目录的路径:

$(TARGET): build $(OBJECTS)
        $(CC) $(OBJECTS) -o $(TARGET) -Lxxx -lcryptopp

(将xxx替换为包含cryptopp库的目录)

【讨论】:

我添加了 $(TARGET): build $(OBJECTS) $(CC) $(OBJECTS) -o $(TARGET) -LC:\cryptopp\include\cryptopp -lcryptopp 但仍然给出关于 -lcrytopp 的相同错误 我怀疑该库是否位于名为 include 的目录中。您在添加到链接行的目录中看到cryptopp.lib 了吗? 是的,先生,我通过将 crytlib.lib 重命名为 crypto.lib 来解决此问题,但这次给 src/mix_file.o: In function ZN8CryptoPP31IteratedHashWithStaticTransformIjNS_10EnumToTypeINS_9ByteOrderELi1EEELj64ELj20ENS_4SHA1ELj0ELb0EE24HashEndianCorrectedBlockEPKj': c:/mingw /cryptopp/iterhash.h:170: 未定义对CryptoPP::SHA1::Transform(unsigned int*, unsigned int const*)' collect2.exe: error: ld returned 1 exit status Makefile:34: recipe for target 'build/ccmix' failed make: *** [build/ccmix] Error 1的引用【参考方案2】:

我应该怎么做才能修复这个“-lcrytopp”错误?

在 Unix 兼容设备上从 Crypto++ 构建目录工作时,该项目不使用 includelib(如您的图片所示)。一切都放在根目录中(如您的图片所示)。

如果您执行make install,则目录已设置,但您似乎没有安装。我还应该说 MinGW 通常不再测试,因为该项目已被放弃,所以我不确定 make install 实际安装到 MinGW 的哪个位置。

要修复编译错误,请调整您的 make 配方:

$(TARGET): build $(OBJECTS)
    $(CXX) $(CXXFLAGS) -I. $(OBJECTS) ./libcryptopp.a -o $(TARGET)

上面的配方使用CXX(C++ 编译器)而不是CC(C 编译器);它使用CXXFLAGS(应该类似于-DNDEBUG -g2 -O2);它调用标题路径(-I.);它链接到静态库 (./libcryptopp.a)。链接到静态库将避免您的下一组问题。

您可以按照 MadScientist 的建议使用 -LXXX-lcryptopp。您甚至可以使用-Wl,-rpath,D:\Osman\CnC RA2\Mix\ccmix-crypto\ccmix-crypto 添加运行路径。但归根结底,使用-L-l 会带来相当多的麻烦。通过静态链接 libcryptopp.a 避免将来出现问题。

另请参阅 Crypto++ wiki 上的 GNUmakefile | Compiling and Linking。


您的第一张图片显示ipchWin32 目录。这通常意味着您使用 Visual Studio 构建了 Crypto++ 库。现在您正在使用 GCC 构建一个程序。您不应该混合和匹配这样的编译器。不会有什么好事。

【讨论】:

以上是关于makefile 上的 GCC 和 Crypto++的主要内容,如果未能解决你的问题,请参考以下文章

Linux下GCC和Makefile实例(从GCC的编译到Makefile的引入)

你如何为 clang 和 gcc 编写一个 makefile?

GCC的使用和Makefile的编写

Linux修炼6.gcc/g++及Makefile工具篇

gcc和make的区别

Makefile的编写