G++ 不包含库
g++ doesn't include libs
我正在尝试用g ++构建一个程序,但是我得到了"未定义的引用"。
文件夹结构:
Makefile
libs/
libcrypotpp.a
libz.a
sources/
here are the sources and headers
out/
objfiles/
生成文件如下所示:
#makefile for program
#needs libz.a and libcryptopp.a
CC = g++
SOURCES = sources/*.cpp
LIBS = -lcryptopp -lz -pthread
LIBPATH = libs/
OBJPATH = objfiles/
OUTPUT = out/
OBJS = *.o
HEADERPATHS = -Isources -Isources/cryptopp
all:
echo "Program"
echo "------------------"
ifneq ("$(wildcard libs/libz.a)", "")
echo "ZLIB found!"
ifneq ("$(wildcard libs/libcryptopp.a)", "")
echo "Cryptopp found!" #all librarys found
$(CC) $(HEADERPATHS) -L$(LIBPATH) $(LIBS) $(SOURCES)
mv *.o $(OBJPATH)
else
echo "error: Cryptopp(libs/libcryptopp.a) was not found!"
endif
else ifneq ("$(wildcard libs/libcryptopp.a)", "")
echo "Cryptopp found!"
echo "error: ZLIB(libs/libz.a) was not found!"
else
echo "error: ZLIB(libs/libz.a) was not found!"
echo "error: Cryptopp(libs/libcryptopp.a) was not found!"
endif
.SILENT: all
G++ 编译,但随后输出未找到的引用:
未定义的引用
为什么会失败?
由于(静态)库可能包含大量在链接到它们的大多数应用程序中未使用的代码,因此链接器对于它们将链接到应用程序的静态库的哪些部分往往非常保守。
在某些情况下,这使我们作为开发人员的生活更加困难,因为您必须遵循不成文的规则才能让一切顺利进行。其中一些不成文的规则是
- 链接器按照在命令行上给出的顺序处理其输入
- 链接器仅考虑第一次遍历输入的库这两者结合起来的效果是,库只能解析在链接器的早期输入中找到的未解析符号。
结果是,为了使链接器保持满意,应最后指定库,如果库 A 依赖于库 B,则应在 B 之前指定 A。
相关文章:
- 如何在 C++ 的 .so 文件中包含库
- 如何在内核中添加包含库的路径?
- 在基于命令行的QT插件构建中包含库
- 检查包含库C++的大小
- 在 C++ 中包含库数据库.txt文件时出错
- C++ 在虚幻引擎中包含库后重新定义类型
- 无法在Windows中找到来自cmake的MySQL和Boost包含/库
- 包含库,同时在 XCode 中以C++编码
- 如何在 CMake 项目中正确包含库
- 修改生成文件以包含库并使用 C++11
- 忽略来自 GDB(终端)中的包含/库文件的调试消息
- 在标题文件和CPP文件中都包含库
- 在Visual Studio C 项目中设置默认的附加包含/库路径
- 在C 项目中包含库的不同方式是什么?
- 在 cmake c++ 项目中包含库的首选方法是什么?
- 在包含库时找不到Qt shared_ptr
- 如何在命令行上使用 Visual Studio 进行编译时包含库
- 彭博数据 API 如何包含库 c++
- G++ 不包含库
- 如何使用函数,而不必在C++中包含库