我正在尝试在Ubuntu 18.04上构建https://github.com/iovisor/bpftrace.git。我手动构建并安装了其依赖项bcc
(bpftrace存储库构建文档建议,因为ubuntu上的打包版本缺少必需的头文件)。
我发现cmake会为我抱怨如下:
-- Looking for bcc_prog_load - not found
在进行了一些CMakeLists.txt
编辑以确保传递了适当的-I
标志之后,并查看了CMakeFiles/CMakeError.log
,我发现构建失败像这样:
/usr/bin/cc -I/home/me/dev/bcc/src/cc -I/home/me/dev/bcc/src/cc/libbpf/src -o CMakeFiles/cmTC_653d8.dir/CheckSymbolExists.c.o -c /home/me/dev/bpftrace/build/CMakeFiles/CMakeTmp/CheckSymbolExists.c
Linking C executable cmTC_653d8
/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_653d8.dir/link.txt --verbose=1
/usr/bin/cc -rdynamic CMakeFiles/cmTC_653d8.dir/CheckSymbolExists.c.o -o cmTC_653d8 -lbcc
CMakeFiles/cmTC_653d8.dir/CheckSymbolExists.c.o: In function `main':
CheckSymbolExists.c:(.text+0x1b): undefined reference to `pthread_create'
collect2: error: ld returned 1 exit status
如果我使用--debug-trycompile
运行并手动运行失败的命令,则会看到将-pthread
命令行选项传递给gcc可以修复该错误。我从this answer收集到以下信息可以解决该问题:
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
target_link_libraries(my_app Threads::Threads)
但是,失败的不是我添加的目标,而只是检查符号是否存在:
check_symbol_exists(bcc_prog_load "libbpf.h" HAVE_BCC_PROG_LOAD)
因此,我不知道如何为target_link_libraries
指定目标。我尝试将target_link_libraries
替换为link_libraries
(删除第一个参数my_app
),但是在测试是否存在CMake时,不会使CMake将-pthread
参数传递给gcc符号。
我该怎么做才能使check_symbol_exists
工作?