【问题标题】:cmake linking against static libraries - do you have to tell cmake where to look?cmake 链接到静态库 - 你必须告诉 cmake 去哪里看吗?
【发布时间】:2018-01-09 10:20:49
【问题描述】:

我已经在我的 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)

【问题讨论】:

    标签: c++ cmake static-libraries pcapplusplus


    【解决方案1】:

    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()`,我读到这是一个链接错误。
    • 当然现在你更喜欢使用target_include_directories而不是普通的旧include_directories
    • @netleaptom 这是一个不同的问题。请为此发布一个新问题。
    【解决方案2】:

    您需要添加头文件搜索目录路径,编译器可以在您的情况下找到头文件Packet.h

    您可以尝试命令locate Packet.h 来查找系统上的路径。然后您可以使用include_directories() 函数添加该路径。即如果你在/usr/local/include/ 中找到Packet.h,那么你应该像下面这样更新。

    include_directories("${PROJECT_SOURCE_DIR}"/include "/usr/local/include/")
    

    【讨论】:

      【解决方案3】:

      错误是因为找不到头文件。我看到你没有提到任何包含文件夹。文件 Packet.h 必须在 /usr/local/include 中。你可以包括这个。 或者你可以添加这样的东西

      find_package(pcapplusplus REQUIRED)
      include_directories(${PCAPPLUSPLUS_INCLUDE_DIRS})
      

      自己处理变量名。

      【讨论】:

      • 我试过了,但是我相信 .cmake 丢失了。显示以下错误:Could not find a package configuration file provided by "pcapplusplus" with any of the following names: pcapplusplusConfig.cmake pcapplusplus-config.cmake
      猜你喜欢
      • 1970-01-01
      • 2012-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-14
      • 2015-10-08
      • 1970-01-01
      • 2018-11-13
      相关资源
      最近更新 更多