1、先搜索target_link_libraries然后在 cjson 后面加上dl
2、记得在CMakeLists.txt文件中添加
set(CMAKE_CXX_STANDARD 11)
3、Ninja下载
你遇到的问题与CMake项目的配置有关。CMake 无法找到与 “Ninja” 对应的构建程序,同时还提示C和C++编译器未设置。通常可以通过以下步骤解决这些问题:
-
安装 Ninja:
如果你想使用 Ninja 作为构建工具,你需要确保它已安装在你的系统上。Ninja 是一种构建工具,通常比 Make 更快。你可以使用系统的软件包管理器来安装它。例如,在 Debian/Ubuntu 上,你可以运行以下命令:sudo apt-get install ninja-build
在其他系统上,你可能需要使用不同的软件包管理器或手动下载 Ninja。
-
设置C和C++编译器:
CMake 需要知道要使用哪个C和C++编译器。你可以在运行CMake时通过设置CMAKE_C_COMPILER
和CMAKE_CXX_COMPILER
变量来指定这些编译器。例如,如果你想使用GCC作为编译器,可以执行以下命令:cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ /你的源代码路径
请将 “gcc” 和 “g++” 替换为你的系统上适当的编译器命令。
-
生成构建系统:
在设置编译器和任何其他必要选项后,你可以生成构建系统。确保指定要使用的生成器(在这种情况下是Ninja):cmake --build . -G Ninja
将 “.” 替换为你的CMake项目目录的路径。这个命令将生成Ninja构建文件并启动构建过程。
如果你不想使用Ninja作为构建系统,你可以在命令中使用不同的生成器,常见的替代选项包括 “Make” 或不指定生成器(CMake将使用系统的默认生成器)。
一旦你解决了这些问题,CMake应该能够成功配置你的项目并生成构建系统。
4、dlsym的bug问题
你的错误消息表明在运行 cat test_white_list.txt
时出现了符号查找错误。这通常发生在共享库(libhook.so
)中引用了一个未定义的符号。
在这种情况下,可能发生以下情况:
-
共享库问题:
libhook.so
可能依赖于其他共享库,而这些库没有正确链接或者版本不匹配。你可以使用以下命令查看libhook.so
的依赖关系:ldd libhook.so
确保所有依赖项都可以正确找到,并且版本匹配。
-
库加载顺序:在运行
cat
时,动态链接器加载共享库。可能libhook.so
被加载,但它依赖的符号在加载时找不到。你可以尝试设置LD_PRELOAD
环境变量来确保libhook.so
在其他库之前加载:LD_PRELOAD=/path/to/libhook.so cat test_white_list.txt
-
CMake 链接问题:检查你的 CMake 构建脚本是否正确配置了链接依赖项,特别是
dlsym
这个符号是否正确链接到libdl
库。确保你的CMakeLists.txt
文件中有类似以下的行:target_link_libraries(your_target_name dl)
这将确保
libdl
库正确链接到你的项目中。
如果以上方法仍无法解决问题,你可能需要进一步检查共享库的依赖关系和构建过程,以确保所有库正确链接,并且符号都能够正确解析。
根据你提供的 libcjson.so.1
的依赖信息,它似乎没有显式依赖于 libdl
库,因为 libdl
没有在依赖列表中。
问题可能出在 libhook.so
中,它依赖于 cjson
并可能间接依赖于 libdl
,但却未正确链接到 libdl
。
你可以尝试在 libhook.so
的构建过程中显式链接到 libdl
,以确保 dlsym
等符号能够正确解析。在你的 CMakeLists.txt 文件中添加以下行:
target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE cjson dl)
这将确保在构建 libhook.so
时,它会正确链接到 libdl
。
raries(${CMAKE_PROJECT_NAME} PRIVATE cjson dl)
这将确保在构建 `libhook.so` 时,它会正确链接到 `libdl`。
重新构建 `libhook.so` 后,再次运行你的测试命令 `cat test_white_list.txt`,看看是否问题得到解决。如果问题仍然存在,请确保 `libhook.so` 的链接设置和运行时环境都正确。