hi to all , i've codeblocks 20 in centos 7. I am building a small project in which i build a libdate.so file and called in my project. as like this :-
dtmanip.h :-
------------
class Date
{
public:
void formDate(std::string &date, int y, int m, int d);
void splitDate(std::string date, int &y, int &m, int &d);
bool isValid(std::string date);
bool isLeap(int y);
private:
int y, m, d;
};
#endif // DTMANIP_H_INCLUDED
in file datefmt.cpp :-
----------------------
#include "dtmanip.h"
using std::string;
void Date::formDate(string &date, int y, int m, int d)
{
string strdt[9] = {"01", "02", "03", "04", "05", "06", "07", "08", "09"};
if(y < 1900 || y > 2100)
{
return;
}
else
{
date += std::to_string(y);
}
date += "/";
if(m < 10)
{
date += strdt[m-1];
}
else if( m > 9 && m< 13)
{
date += std::to_string(m);
}
date += "/";
if(d < 10 )
{
date = strdt[d - 1];
}
else if(d > 9 && d < 32)
{
date += std::to_string(d);
}
}
void Date::splitDate(string date, int &y, int &m, int &d)
{
string yy = date.substr(0, 3);
string mm = date.substr(5, 6);
string dd = date.substr(8, 9);
y = stoi(yy);
m = stoi(mm);
d = stoi(dd);
}
bool Date::isValid(string date)
{
return true;
}
bool Date::isLeap(int y)
{
return true;
}
now file libdate.so has been created successfully.. i copied and pasted header file in /usr/include and lib file in /usr/lib64
now i added this file in my project
in my project i declared object of class Date as *dt in header file and defined in constructor.
now when i called dt->splitDate(strdt, y, m, d);
here is error : classBill.cpp|584|undefined reference to `Date::splitDate(std::string, int&, int&, int&)'|
code is :
void classBill::todaySales()
{
mysql = classConn::connection();
mysql->reconnect = true;
draw->clrscr();
draw->drawRect();
draw->gotoxy(15, 3);
cout << "Sales By Date";
draw->gotoxy(13,4);
cout << "-----------------";
draw->gotoxy(10, 5);
cout << "Enter Date to see sale : ( yyyy / MM/ dd ) : ";
std::string strdt;
// dt->formDate(strdt, )
getline(cin,strdate);
int y, m, d;
dt->splitDate(strdate, y, m, d); // here is error
draw->gotoxy(10, 6);
cout << "date : " << y <<"/" << m << "/" << d;
getc->getch();
}
Please format your code using the Code format tags.
You can check what's exported from your shared library with nm. nm dumps pretty much everything, but exported symbols are described with T.
So to see all the exported symbols in your libdate.so, run:
nm -C libdate.so | grep " T "
If splitDate is missing, it didn't make it into the library. If it is present in the library, it's a build problem, and we'll need to see your link line.
[root@centos7client Debug]# nm -C libdate.so | grep " T "
00000000000026a0 T _fini
0000000000001650 T _init
00000000000020ca T Date::isLeap(int)
00000000000020b6 T Date::isValid(std::string)
0000000000001a06 T Date::formDate(std::string&, int, int, int)
0000000000001f2c T Date::splitDate(std::string, int&, int&, int&)
> now file libdate.so has been created successfully..
> i copied and pasted header file in /usr/include and lib file in /usr/lib64
You need to tell the compiler (via Project->Build Options...) that you want to use that library.
Dialog should look something like https://imgur.com/a/YmNpy1C
Also, you shouldn't be putting your own headers and libraries directly in the system directories.
Use the search directories tab to list other places to search for include and library files.
Also, you shouldn't be putting your own headers and libraries directly in the system directories.
Use the search directories tab to list other places to search for include and library files.
This. Very much this.
You can have your custom libraries within you home directory and tell you IDE/build system/compiler where they are when you build dependent projects.
System directories have files installed from packages by package manager. Packages include metadata, so package manager knows what files belong to package and can later cleanly uninstall (i.e. remove) package content. Furthermore, package manager will notice when two packages offer file with same name, i.e. detect conflicts.
If you place files manually and then install some package that contains file with same name, your manually copied file will be silently overwritten, i.e. programs depending on it will break. While the risk seems small, why take it at all?