I have the following folder structure in my HOME:
- myproject/
+ src/
+ utilities.cpp
+ inc/
+ Executor.hpp
+ utilities.hpp
+ lib/
+ utilities.o
+ libutilities.so
- other_project/
+ main.cpp
The utilities.hpp contains:
#pragma once
#ifndef UTILITIES_HXX
#define UTILITIES_HXX
#include <string>
#include <iostream>
#include <map>
#include <vector>
namespace myproject{
void readFromCSV(const std::string& filename,char delimiter,const int nlines,std::map<int,std::vector<std::string>> & csv_contents);
}
#endif
and the utilities.cpp :
#include "utilities.hpp"
#include<fstream>
#include<algorithm>
#include<sstream>
const std::string readFileIntoString(const std::string & path){
auto ss=std::ostringstream{};
std::ifstream input_file(path);
if(!input_file.is_open()){
std::cout<<"Unable to open" << path;
exit(0);
}
ss<<input_file.rdbuf();
return ss.str();
}
void readFromCSV(const std::string& filename,char delimiter,const int nlines,std::map<int,std::vector<std::string>> & csv_contents){
std::string file_contents=readFileIntoString(filename);
std::istringstream sstream(file_contents);
std::vector<std::string> items;
std::string record;
int counter=0;
while(std::getline(sstream,record)&&(counter<nlines)){
std::istringstream line(record);
while(std::getline(line,record,delimiter)){
record.erase(std::remove_if(record.begin(), record.end(), isspace), record.end());
items.push_back(record);
}
csv_contents[counter]=items;
items.clear();
counter++;
}
}
For creating the libutilities.so I executed the following bash script in $HOME/myproject:
g++ -I./inc -fPIC -c -o utilities.o src/utilities.cpp
gcc -shared -o libutilities.so utilities.o
mv libutilities.so lib/
mv utilities.o lib/
This compiles fine. So I want to use the utilities library in other_project/main.cpp:
#include "Executor.hpp"
#include "utilities.hpp"
using namespace myproject;
main(){
//variable declaration and definition
readFromCSV(setFilename(PATH_INPUT,SUFFIX_INPUT,batch_index),';',batches,p);
//other code
}
So when I compile this as:
g++ -o main main.o -I$(HOME)/myproject/inc -L$(HOME)/myproject/lib -lutilities
within the Makefile, I got the following error:
/usr/bin/ld: main.o: in function `main()': /my_home_directory/other_project/main.cpp:168: undefined reference to myproject::readFromCSV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char, int, std::map<int, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::less<int>, std::allocator<std::pair<int const, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >&)'
pgacclnk: child process exit status 1: /usr/bin/ld
Any idea?
thanks