2ir0
2ir0

Reputation: 41

CMake - undefined symbols encountered when building application depends on PcapPlusPlus

I programmed a simple application using PcapPlusPlus library with CLion on MacOS. The code is really simple:

#include "../include/PCPP/PcapFileDevice.h"

int main(int argc, char* argv[])
{
    std::string path;
    pcpp::PcapFileReaderDevice reader(path);
    reader.open();
    reader.close();
    return 0;
}

Here is CMakeLists.txt:

cmake_minimum_required(VERSION 3.5)
set(CMAKE_CXX_STANDARD 11)
project (Test CXX)
add_executable(cmd_main ${PROJECT_SOURCE_DIR}/test/cmd_main.cpp)
target_include_directories(cmd_main
    PUBLIC 
        ${PROJECT_SOURCE_DIR}/include)
target_link_libraries(cmd_main
    PUBLIC
        ${PROJECT_SOURCE_DIR}/lib/libCommon++.a
        ${PROJECT_SOURCE_DIR}/lib/libPacket++.a
        ${PROJECT_SOURCE_DIR}/lib/libPcap++.a
)

The directory is also simple:

|
|--include
|----PCPP/
|--lib
|----libCommon++.a
|----libPacket++.a
|----libPcap++.a
|--test
|----cmd_main.cpp

Here is compile result:

(base) 2ir0@iMac Test % cmake .
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/2ir0/Documents/Maltrace
(base) 2ir0@iMac Test % make
Scanning dependencies of target cmd_main
[ 50%] Building CXX object CMakeFiles/cmd_main.dir/test/cmd_main.cpp.o
[100%] Linking CXX executable cmd_main
Undefined symbols for architecture x86_64:
  "_pcap_close", referenced from:
      pcpp::IFileDevice::close() in libPcap++.a(PcapFileDevice.o)
      pcpp::PcapFileReaderDevice::open() in libPcap++.a(PcapFileDevice.o)
  "_pcap_compile", referenced from:
      pcpp::IPcapDevice::setFilter(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in libPcap++.a(PcapDevice.o)
......
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [cmd_main] Error 1
make[1]: *** [CMakeFiles/cmd_main.dir/all] Error 2
make: *** [all] Error 2

It seems cmd_main didn't link PcapPlusPlus library. But why?

Upvotes: 2

Views: 307

Answers (1)

2ir0
2ir0

Reputation: 41

I read the error information carefully, found that PcapPlusPlus need libpcap library, so I added libpcap.a, and fixed the problem.

Upvotes: 2

Related Questions