【发布时间】:2021-04-09 20:46:35
【问题描述】:
我正在寻找在编译包含它作为头文件的程序时要包含哪个 C 库,在本例中为 #include <pcre2.h>。我能够弄清楚我需要文件在哪里的唯一方法是检查我知道需要导出的特定符号。例如:
$ ls
CMakeCache.txt Makefile install_manifest.txt libpcre2-posix.pc pcre2_grep_test.sh
CMakeFiles a.out libpcre2-8.a pcre2-config pcre2_test.sh
CTestCustom.ctest cmake_install.cmake libpcre2-8.pc pcre2.h pcre2grep
CTestTestfile.cmake config.h libpcre2-posix.a pcre2_chartables.c pcre2test
$ objdump -t libpcre2-8.a|grep pcre2_compile
pcre2_compile.c.o: file format elf64-x86-64
0000000000000000 l df *ABS* 0000000000000000 pcre2_compile.c
00000000000100bc g F .text 00000000000019dd pcre2_compile_8
0000000000000172 g F .text 00000000000000e3 pcre2_compile_context_create_8
0000000000000426 g F .text 0000000000000055 pcre2_compile_context_copy_8
0000000000000557 g F .text 0000000000000032 pcre2_compile_context_free_8
并且因为符号pcre2_compile_8 存在于该文件中(在尝试了所有其他文件之后......)我知道我需要包含的库是pcre2-8,也就是说,我编译我的代码:
$ gcc myfile.c -lpcre2-8 -o myfile; ./myfile
与此相关的两个问题:
- 有没有更简单的方法在一批文件(其中一些不是elf文件)中查找符号?例如,
objdump -t *?或者最接近这样做的方法是什么? - 有没有更好的方法来找出
-l<library>的库值是多少?或者,当有人下载一个新的 C 程序时,他们知道要在命令行中添加什么以使程序正常工作的常见方式是什么? (对我来说,我刚刚花了最后一个小时弄清楚它是-lpcre2-8而不是-lpcre或-lpcre2。
【问题讨论】:
-
库的文档通常应该包含这些信息。
-
通常,软件包附带 README 或其他描述链接内容的文档。
-
有时,您可以使用
pkg-config,例如pkg-config --libs pcre. -
通过正常的完整安装,
.h文件转到(例如)/usr/include/local,但.a或.so转到/usr/local/lib64。那么,您的ls显示它们位于同一目录中,您正在执行make的目录也是如此吗?如果您不需要/不想安装,您可以(例如)pcdir=/home/me/pcre_build_directory ; gcc myfile.c -I $pcdir -L $pcdir -lpcre2-8 -o myfile。有时,最好将-lwhatever作为gcc的last arg。您还可以在strace下运行gcc以查看检查了哪些目录。 -
@OlafDietsche 我明白了,谢谢你的建议。这在
$ pkg-config --list-all | grep pcre上效果很好,但如果我以--libs pcre的方式进行操作,它会显示找不到包。如何让 pkg-config 识别pcre?
标签: c cmake linker elf symbol-table