netleap tom
netleap tom

Reputation: 163

cmake linking against static libraries - do you have to tell cmake where to look?

I've installed the c++ library pcapplusplus on my linux machine and the .a files have been put in /usr/local/lib. I am now trying to link my project with it in cmake using target_link_libraries(${PROJECT_NAME} libCommon++.a libPacket++.a libPcap++.a). However, it can't find Packet.h which is part of libPacket++.a. What am I doing wrong here? Do I have to tell cmake where to look?

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)

Upvotes: 3

Views: 2474

Answers (3)

wolff
wolff

Reputation: 436

Packet.h is not part of libPacket++.a.

libPacket++.a is a library, Packet.h is a header file.

CMake can't know that both relate to each other unless you tell it so.

I suggest using find_package to properly locate both (https://cmake.org/cmake/help/v3.0/command/find_package.html).

Use target_include_directories then to include the path to the header file.

Upvotes: 6

Naveen KH
Naveen KH

Reputation: 163

The error is because it is not able to find the header file. I see that you havent mentioned any include folders. The file Packet.h must be in /usr/local/include. You can either include this. OR you can add something like this

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

Take care of varible names yourself.

Upvotes: 1

Manthan Tilva
Manthan Tilva

Reputation: 3277

You need to add header search directory path where compiler can find header file in your case Packet.h

You can try command locate Packet.h to find out path on your system. Then you can add that path with include_directories() function. i.e. if you found Packet.h in /usr/local/include/ then you should update like below.

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

Upvotes: 1

Related Questions