Reputation: 521
I am trying to do a project in C++ with the help of curlcpp and cmake, but I am unable to compile the project.
I am new to CMakeLists and it is quite difficult to understand how to add the stuff you require to make your project work. I basically usually copy what I can find in other posts without really understanding how they work; tutorial and documentation is usually either too basic or to complex. To make things worse, I have the impression that each library is added differently so when there is a new one to add the only way I have to add it is to search for previous post asking how to do it. In this case I was unable to find anything that helped me.
So here is what I have done:
After installing curlpp and curl with homebrew
brew install curl
brew install curlpp
I write my project:
Cmakelists.txt:
cmake_minimum_required(VERSION 3.0)
project(stock_analysis)
set(CMAKE_CXX_FLAGS "-g -Wall -std=c++11")
######## BOOST STUFF ########
#DELETE NEXT LINE
set(Boost_NO_BOOST_CMAKE ON)
# set(Boost_USE_STATIC_LIBS ON) # only find static libs
# set(Boost_USE_MULTITHREADED ON)
# set(Boost_USE_STATIC_RUNTIME OFF)
find_package(Boost COMPONENTS
filesystem
)
######## CURL STUFF ########
include(FindCURL)
find_package(CURL REQUIRED)
if(CURL_FOUND)
message(STATUS "Found CURL version: ${CURL_VERSION_STRING}")
message(STATUS "Using CURL include dir(s): ${CURL_INCLUDE_DIRS}")
message(STATUS "Using CURL lib(s): ${CURL_LIBRARIES}")
else()
message(FATAL_ERROR "Could not find CURL")
endif()
SET(HEADERS
include
)
SET(SOURCE_FILES
src/main.cpp
src/analyse.cpp
src/helpers.cpp
src/simulation.cpp
src/data.cpp
)
include_directories(${HEADERS}
${Boost_INCLUDE_DIRS}
${CURL_INCLUDE_DIRS}
)
add_executable(app ${SOURCE_FILES})
target_link_libraries(app
${Boost_LIBRARIES}
${CURL_LIBRARIES}
)
Function in data.cpp (I basically copy the example in curlcpp webpage):
#include "data.h"
#include <iostream>
#include <curlpp/cURLpp.hpp>
#include <curlpp/Easy.hpp>
#include <curlpp/Options.hpp>
using namespace curlpp::options;
void fetchData(){
try
{
// That's all that is needed to do cleanup of used resources (RAII style).
curlpp::Cleanup myCleanup;
// Our request to be sent.
curlpp::Easy myRequest;
// Set the URL.
myRequest.setOpt<Url>("http://example.com");
// Send request and get a result.
// By default the result goes to standard output.
myRequest.perform();
}
catch( curlpp::RuntimeError &e )
{
std::cout << e.what() << std::endl;
}
catch( curlpp::LogicError &e )
{
std::cout << e.what() << std::endl;
}
}
The error I get:
Undefined symbols for architecture x86_64:
"curlpp::OptionBase::OptionBase(CURLoption)", referenced from:
curlpp::Option<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::Option(CURLoption, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in data.cpp.o
"curlpp::OptionBase::~OptionBase()", referenced from:
curlpp::Option<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::Option(CURLoption, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in data.cpp.o
curlpp::Option<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::~Option() in data.cpp.o
"curlpp::UnsetOption::UnsetOption(char const*)", referenced from:
curlpp::Option<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::updateMeToOption(curlpp::OptionBase const&) in data.cpp.o
curlpp::OptionTrait<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, (CURLoption)10002>::updateHandleToMe(curlpp::internal::CurlHandle*) const in data.cpp.o
curlpp::Option<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::getValue() const in data.cpp.o
"curlpp::RuntimeError::~RuntimeError()", referenced from:
curlpp::UnsetOption::~UnsetOption() in data.cpp.o
"curlpp::libcurlRuntimeAssert(char const*, CURLcode)", referenced from:
void curlpp::internal::CurlHandle::option<void*>(CURLoption, void*) in data.cpp.o
"curlpp::Easy::perform()", referenced from:
StockAnalysis::fetchData(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool const&) in data.cpp.o
"curlpp::Easy::Easy()", referenced from:
StockAnalysis::fetchData(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool const&) in data.cpp.o
"curlpp::Easy::~Easy()", referenced from:
StockAnalysis::fetchData(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool const&) in data.cpp.o
"curlpp::Cleanup::Cleanup()", referenced from:
StockAnalysis::fetchData(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool const&) in data.cpp.o
"curlpp::Cleanup::~Cleanup()", referenced from:
StockAnalysis::fetchData(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool const&) in data.cpp.o
"curlpp::OptionBase::operator<(curlpp::OptionBase const&) const", referenced from:
vtable for curlpp::OptionTrait<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, (CURLoption)10002> in data.cpp.o
vtable for curlpp::Option<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > in data.cpp.o
"typeinfo for curlpp::LogicError", referenced from:
GCC_except_table0 in data.cpp.o
"typeinfo for curlpp::OptionBase", referenced from:
curlpp::Option<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::updateMeToOption(curlpp::OptionBase const&) in data.cpp.o
typeinfo for curlpp::Option<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > in data.cpp.o
"typeinfo for curlpp::RuntimeError", referenced from:
GCC_except_table0 in data.cpp.o
typeinfo for curlpp::UnsetOption in data.cpp.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]: *** [app] Error 1
make[1]: *** [CMakeFiles/app.dir/all] Error 2
make: *** [all] Error 2
I had previously followed the next thread: Linking curl in a project using CMake
Adding curlcpp to target_link_libraries() in the cmakelists just makes another error appear:
ld: library not found for -lcurlpp
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [app] Error 1
make[1]: *** [CMakeFiles/app.dir/all] Error 2
make: *** [all] Error 2
By the way, I do not understand why curlcpp appears from no where and without the traditional cmakelists notation ${Some_variable}
Upvotes: 4
Views: 2918
Reputation: 557
use curlpp like below(minimum code):
cmake_minimum_required(VERSION 3.14)
project(testCurlPP LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
include(FindPkgConfig)
pkg_check_modules(CURLPP REQUIRED curlpp)
add_executable(testCurlPP
main.cpp
)
target_link_libraries(testCurlPP
${CURLPP_LDFLAGS}
)
Note: dont forget to building and installing curlpp before using that in projects.
building(take last release) curlpp:
mkdir build
cd build
cmake ..
make -j8
sudo make install
add its location to environment variables:
LD_LIBRARY_PATH=/usr/local/lib
Upvotes: 2