CMake链接静态库 - 需要告诉CMake去哪里查找吗?

3
我已经在我的Linux机器上安装了C++库pcapplusplus.a文件已经放置在/usr/local/lib中。我现在正在尝试使用target_link_libraries(${PROJECT_NAME} libCommon++.a libPacket++.a libPcap++.a)在cmake中将我的项目与它链接起来。然而,它找不到Packet.h,这是libPacket++.a的一部分。我在这里做错了什么?我需要告诉cmake去哪里查找吗?
cmake_minimum_required(VERSION 2.8.9)
project(networksniffer)
# The version number.
set (networksniffer_VERSION_MAJOR 1)
set (networksniffer_VERSION_MINOR 0)

set(CMAKE_BINARY_DIR ${CMAKE_SOURCE_DIR}/build)
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR})
set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR})
set(PROJECT_SOURCE_DIR ${CMAKE_SOURCE_DIR}/src)

# The following folder will be included
include_directories("/usr/local/include/pcapplusplus")

#add_executable(networksniffer ${SOURCES})
add_executable(networksniffer ${PROJECT_SOURCE_DIR}/networksniffer.cpp)

target_link_libraries(${PROJECT_NAME} libCommon++.a libPacket++.a libPcap++.a)
3个回答

6

Packet.h不是libPacket++.a的一部分。

libPacket++.a是一个库文件,Packet.h是一个头文件。

除非你告诉它们相关,否则CMake无法知道它们之间的关系。

我建议使用find_package来正确定位两个文件(https://cmake.org/cmake/help/v3.0/command/find_package.html)。

然后使用target_include_directories来包含头文件的路径。


谢谢,我已经在原始帖子中更新了我的cmakelists.txt文件。添加include_directories("/usr/local/include/pcapplusplus")解决了找不到Packet.h的问题。然而,现在项目已经构建完成,但我遇到了undefined reference to pcpp::compute_checksum()`这个链接错误。 - netleap tom
1
当然,现在您更喜欢使用target_include_directories,而不是普通的include_directories - ComicSansMS
@netleaptom 这是一个不同的问题。请发布一个新的问题来解决它。 - wolff

1
你需要添加头文件搜索目录,以便编译器能够在你的Packet.h文件中找到头文件路径。
你可以尝试使用locate Packet.h命令查询系统上的路径。然后你可以使用include_directories()函数添加该路径。例如,如果你在/usr/local/include/中找到了Packet.h,那么你应该进行以下更新。
include_directories("${PROJECT_SOURCE_DIR}"/include "/usr/local/include/")

1
错误是因为找不到头文件。我看到你没有提到任何包含文件夹。文件Packet.h必须在/usr/local/include中。你可以包含它。或者你可以添加类似于这样的内容。
find_package(pcapplusplus REQUIRED)
include_directories(${PCAPPLUSPLUS_INCLUDE_DIRS})

自己注意变量名称。


我尝试了,但我认为缺少 .cmake。出现了以下错误: 无法找到由 "pcapplusplus" 提供的包配置文件,具有以下任何名称之一: pcapplusplusConfig.cmake pcapplusplus-config.cmake - nav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接