My Code::Blocks IDE is calling just "error: ld returned 1 exit status" when I build my code. I frequently saw this error with "collect2:" as "collect2: ld returned 1 exit status". I just know this is linker error. So I need to include another linraries.
But I'm inexperienced to use this IDE even if C++.
So I don't get it how I get rid of this error.
I would like to ask below things.
1)How to get rid of this error. What issues are considered.
2)How to set up Build options to suit my code in below.
Note(Build opetions): Link libraries in Linker setting is added
../../opencv-2.4.13/build/lib/libopencv_highgui.so
../../opencv-2.4.13/build/lib/libopencv_core.so
../../opencv-2.4.13/build/lib/libopencv_imgproc.so
pthread
boost_system
and, Compiler in Search directories is
../../opencv-2.4.13/include/opencv
../../../../usr/include/boost
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/managed_mapped_file.hpp>
#include <boost/interprocess/containers/vector.hpp> // boost/containers/vector.hpp
#include <boost/interprocess/containers/string.hpp> // boost/containers/string.hpp
#include <iostream>
#include <sys/time.h>
#include <stdio.h>
// void_allocator;
namespace bip = boost::interprocess;
typedef unsigned char uchar;
//Typedefs of allocators and containers
typedef bip::managed_shared_memory::segment_manager segment_manager_t;
typedef bip::allocator<void, segment_manager_t> void_allocator;
typedef void_allocator::rebind<uchar>::other uchar_allocator;
typedef bip::vector<uchar, uchar_allocator> uchar_vector;
template <typename Alloc = std::allocator<uchar> >
struct BasicInData {
public:
BasicInData(Alloc alloc = {}) : image(alloc)
{ }
template <typename T>
BasicInData(double x, int sizeImg, uchar_vector& image, Alloc alloc = {}) :
x(x), sizeImg(sizeImg), image(alloc)
{ }
double x = 0;
int sizeImg = 0;
uchar_vector image;
};
using InData = BasicInData<>; // just heap allocated
namespace Shared {
using segment = bip::managed_shared_memory;
using segment_manager = segment::segment_manager;
template <typename T> using alloc = bip::allocator<T, segment_manager>;
template <typename T> using vector = bip::vector<T, alloc<T> >;
using InData = BasicInData<alloc<uchar> >; // shared memory version
vector<InData>& locate(segment& smt) {
auto* v = smt.find_or_construct<vector<InData> >("InDataVector")(smt.get_segment_manager());
assert(v);
return *v;
}
}
int main(int argc, char* argv[]) {
if(argc == 1){ //Parent process
// Remove shared memory on construction and destruction
// Create a new segment with given name and size
struct timeval tv;
gettimeofday(&tv, NULL);
struct shm_remove
{
shm_remove(){bip::shared_memory_object::remove("MySharedMemory");}
~shm_remove(){bip::shared_memory_object::remove("MySharedMemory");}
}remover;
Shared::segment smt(bip::create_only,"MySharedMemory", 65536); // 10 Kb for coliru
auto &data = Shared::locate(smt);
//Shared::alloc bip::alloc_inst (data);
cv::Mat_<cv::Vec3b> mat;
cv::VideoCapture vcap(0);
Shared::InData id(smt.get_segment_manager());
if (!vcap.isOpened())
return -1;
while (1) {
vcap >> mat;
int image_size = mat.total() * mat.elemSize();
id.sizeImg = image_size;
id.image.resize(image_size * sizeof(uchar));
memcpy(&id.image[0], mat.data, image_size * sizeof(uchar));
//Launch child process
gettimeofday(&tv, NULL);
double time = ((double)tv.tv_usec/1000000);
id.x = time;
data.push_back(id);
if(cv::waitKey(30) >= 0) break;
}
std::string s(argv[0]); s += " child";
if(0 != std::system(s.c_str()))
return 1;
// check child has destroyed the vector
if(smt.find<Shared::vector<InData>>("InDataVector").first)
return 1;
} else{
// Open the managed segment
bip::managed_shared_memory segment(bip::open_only, "MySharedMemory");
// Find the vector using c-string name
bip::vector<InData> *myvector = segment.find<bip::vector<InData>>("InDataVector").first;
// Use vector in reverse order
bip::vector<InData>::iterator it;
cv::Mat_<cv::Vec3b> im;
for(it = myvector->begin(); it !=myvector->end(); ++it){
im.resize(it->sizeImg);
memcpy(im.data, &it->image[0], it->sizeImg);
cv::imshow("window1", im);
}
segment.destroy<bip::vector<InData>>("InDataVector");
return 0;
}
}