2

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

MyDesktop

#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;
    }
}
NEWBIEEBIEE
  • 197
  • 2
  • 13

1 Answers1

0

Thanks, @greatwolf. Finally, I could get rid of that error. Now,I show the "Linker setting" in below.

../../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

rt
NEWBIEEBIEE
  • 197
  • 2
  • 13