Started working for the first time really with headers and am running into a problem. I created a cpp file with a corresponding hpp file that i include in my main and also again in the cpp file now I get the following error:
[build] FAILED: test.exe
[build] cmd.exe /C "cd . && C:\msys64\mingw64\bin\x86_64-w64-mingw32-g++.exe -g CMakeFiles/test.dir/Main.cpp.obj CMakeFiles/test.dir/random.cpp.obj -o test.exe -Wl,--out-implib,libtest.dll.a -Wl,--major-image-version,0,--minor-image-version,0 -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 && cd ."
[build] C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles/test.dir/Main.cpp.obj:C:/Users/marks/Master_Project/mark-msc/Main.cpp:10: undefined reference to `cel::inputcells(std::vector<std::vector<cel::Bacteria, std::allocator<cel::Bacteria> >, std::allocator<std::vector<cel::Bacteria, std::allocator<cel::Bacteria> > > >&, int, int, int, int, int)'
[build] C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles/test.dir/Main.cpp.obj: in function `main':
[build] C:/Users/marks/Master_Project/mark-msc/Main.cpp:25: undefined reference to `std::bitset<25> cel::random_bitset<25>(double)'
[build] C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:/Users/marks/Master_Project/mark-msc/Main.cpp:27: undefined reference to `cel::RotateParticles(std::vector<std::vector<cel::Bacteria, std::allocator<cel::Bacteria> >, std::allocator<std::vector<cel::Bacteria, std::allocator<cel::Bacteria> > > >&, int, int, std::bitset<25ull>)'
[build] collect2.exe: error: ld returned 1 exit status
[build] ninja: build stopped: subcommand failed.
[build] Build finished with exit code 1
Bascially it shows that there are undefined references to all the functions present in my CellLayer.cpp and hpp file. These look as followed:
CellLayer.cpp:
#include "random.hpp"
#include "CellLayer.hpp"
void cel::inputcells (std::vector<std::vector<Bacteria>> &CellGrid, int NrPfree, int NrP1, int NrP2, int NrP3, int N)
{
for (int i = 0; i < NrPfree; ++i)
{
int randomnumber1 = rnd::uni_int(0, N);
int randomnumber2 = rnd::uni_int(0, N);
CellGrid[randomnumber1][randomnumber2].alive = true;
}
for (int j = 0; j < NrP1; )
{
int randomnumber1 = rnd::uni_int(0, N);
int randomnumber2 = rnd::uni_int(0, N);
if (!CellGrid[randomnumber1][randomnumber2].alive)
{
CellGrid[randomnumber1][randomnumber2].alive = true;
std::bitset<3> P1 (std::string("001")) ;
CellGrid[randomnumber1][randomnumber2].plasmid = P1;
++j;
}
}
for (int p = 0; p < NrP2; )
{
int randomnumber1 = rnd::uni_int(0, N);
int randomnumber2 = rnd::uni_int(0, N);
if (!CellGrid[randomnumber1][randomnumber2].alive)
{
CellGrid[randomnumber1][randomnumber2].alive = true;
std::bitset<3> P2 (std::string("010"));
CellGrid[randomnumber1][randomnumber2].plasmid = P2;
++p;
}
}
for (int l = 0; l < NrP3; )
{
int randomnumber1 = rnd::uni_int(0, N);
int randomnumber2 = rnd::uni_int(0, N);
if (!CellGrid[randomnumber1][randomnumber2].alive)
{
CellGrid[randomnumber1][randomnumber2].alive = true;
std::bitset<3> P3 (std::string("100"));
CellGrid[randomnumber1][randomnumber2].plasmid = P3;
++l;
}
}
}
std::bitset<25> cel::random_bitset(double p = 0.5) {
std::bitset<25> bits;
std::random_device rd;
std::mt19937 gen(rd());
std::bernoulli_distribution d(p);
for( int n = 0; n < size; ++n) {
bits[n] = d(gen);
}
return bits;
}
// Function to rotate and shift the margolus neighbourhood
void cel::RotateParticles(std::vector<std::vector<Bacteria>> &Cellgrid, int t, int N, std::bitset<25> bitseq)
{
//offset for even and uneven timesteps
int offset = t % 2;
//for looping through bitseq
int count = 0;
for(int i0 = offset; i0 < N; i0 += 2)
{
const int i1 = (i0 + 1) % N;
for(int j0 = offset; j0 < N; j0 += 2)
{
const int j1 = (j0 + 1) % N;;
if(bitseq[count])
{
// rotating clockwise
Bacteria tmp = Cellgrid[i0][j0];
Cellgrid[i0][j0] = Cellgrid[i0][j1];
Cellgrid[i0][j1] = Cellgrid[i1][j1];
Cellgrid[i1][j1] = Cellgrid[i1][j0];
Cellgrid[i1][j0] = tmp;
++count;
}
else
{
//rotating counterclockwise
Bacteria tmp = Cellgrid[i0][j0];
Cellgrid[i0][j0] = Cellgrid[i1][j0];
Cellgrid[i1][j0] = Cellgrid[i1][j1];
Cellgrid[i1][j1] = Cellgrid[i0][j1];
Cellgrid[i0][j1] = tmp;
++count;
}
}
}
}
//not finished
void cel::Die (std::vector<std::vector<Bacteria>> &Cellgrid, std::vector<std::vector<std::vector<int>>> &system, std::vector<double> DchanceFree, std::vector<double> DchanceBear, std::pair<int, int>)
{
std::vector<int> AntiB = {0, 1, 2};
std::shuffle(std::begin(AntiB), std::end(AntiB), rnd::rn);
}
and the hpp file:
#ifndef CellLayer_hpp
#define CellLayer_hpp
#include <vector>
#include <iosfwd>
#include <string>
#include <memory>
#include <bits/stdc++.h>
namespace cel
{
class Bacteria {public: std::bitset<3> plasmid; bool alive; };
void inputcells (std::vector<std::vector<Bacteria>> &CellGrid, int NrPfree, int NrP1, int NrP2, int NrP3, int N);
std::bitset<25> random_bitset(double p = 0.5);
void RotateParticles(std::vector<std::vector<Bacteria>> &Cellgrid, int t, int N, std::bitset<25> bitseq);
void Die (std::vector<std::vector<Bacteria>> &Cellgrid, std::vector<std::vector<std::vector<int>>> &system, std::vector<double> DchanceFree, std::vector<double> DchanceBear, std::pair<int, int>);
}
#endif
Then in my main I have this:
#include "random.hpp"
#include "CellLayer.hpp"
int main()
{
const int N = 10;
const int T = 5;
std::vector<std::vector<cel::Bacteria>> gridab(N, std::vector<cel::Bacteria>(N));
cel::inputcells(gridab, 1, 1, 1, 1, N);
for (int j = 0; j < N; ++j)
{
std::cout << "\n";
for (int i = 0; i < N; ++i)
{
std::cout << gridab[j][i].alive << " ";
}
}
std::cout << "\n";
for (int t = 0; t < T; ++t)
{
std::bitset<25> bitseq;
bitseq = cel::random_bitset( 0.5);
cel::RotateParticles(gridab, t, N, bitseq);
for (int j = 0; j < N; ++j)
{
std::cout << "\n";
for (int i = 0; i < N; ++i)
{
std::cout << gridab[j][i].alive << " ";
}
}
std::cout << "\n";
}
return 0;
}
I truely have no idea why it's not working, as you can see I also have a random.hpp (& cpp) file which seem to be included just fine. If anyone has any insightes as to what may cause this problem that would be great.