Recently, I was learning CMake using ttroy50/cmake-examples. But when I learning H-third-party-library, I meet a problem! This tutorial said we can use find_package
function to find third party libraries. We have the following main.cpp:
#include <iostream>
#include <boost/shared_ptr.hpp>
#include <boost/filesystem.hpp>
int main(int argc, char *argv[])
{
std::cout << "Hello Third Party Include!" << std::endl;
// use a shared ptr
boost::shared_ptr<int> isp(new int(4));
// trivial use of boost filesystem
boost::filesystem::path path = "/usr/share/cmake/modules";
if(path.is_relative())
{
std::cout << "Path is relative" << std::endl;
}
else
{
std::cout << "Path is not relative" << std::endl;
}
return 0;
}
In this souce file, we using boost/shared_ptr
and boost/filesystems
. But we have the following CMakeLists.txt:
cmake_minimum_required(VERSION 3.5)
# Set the project name
project (third_party_include)
# find a boost install with the libraries filesystem and system
find_package(Boost 1.46.1 REQUIRED COMPONENTS filesystem system)
# check if boost was found
if(Boost_FOUND)
message ("boost found")
else()
message (FATAL_ERROR "Cannot find Boost")
endif()
# Add an executable
add_executable(third_party_include main.cpp)
# link against the boost libraries
target_link_libraries( third_party_include
PRIVATE
Boost::filesystem
)
We can correctly build and run! But why don't we need add Boost::shared_ptr
to CMakeLists.txt's target_link_libraries
? We also use it!!!
And where can I know which alias can I use for a Boost library, such as Boost::filesystem?
I want to know why I don't need add Boost::shared_ptr
to target_link_libraries
.
I have another question. In above CMakeLists.txt file I have not include boost header file directories. But it work normally.
Is this because the header file directories path is /usr/include
(GCC will default search header file in this directories )? Or because the imported target(Boost::filesystem
) will add the header directories Path to my targetthird_party_include
in the function target_link_libraries
?
boost::shared_ptr
is part of the Boost smart_ptr library. So I assume you'd target_link_libraries
to Boost::smart_ptr
(and not to some Boost::shared_ptr
). I'm assuming the Boost CMake library target names are derived (lower-snake-case) from the names of the libraries themselves. See the FindBoost docs' section on the imported targets- in particular, Boost::<component>
. I'm guessing the reason why it worked without you doing anything might have to do with the include directories for Boost Filesystem and Boost Smart Ptr being the same in your installation of Boost, and with Boost Smart Ptr being header-only (see also Which Boost libraries are header-only?).