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++ 构建目录工作时,该项目不使用 include
和 lib
(如您的图片所示)。一切都放在根目录中(如您的图片所示)。
如果您执行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。
您的第一张图片显示ipch
和Win32
目录。这通常意味着您使用 Visual Studio 构建了 Crypto++ 库。现在您正在使用 GCC 构建一个程序。您不应该混合和匹配这样的编译器。不会有什么好事。
【讨论】:
以上是关于makefile 上的 GCC 和 Crypto++的主要内容,如果未能解决你的问题,请参考以下文章
Linux下GCC和Makefile实例(从GCC的编译到Makefile的引入)