0

I have found this issue many times and I went through dozens of found answers here (on stackoverflow) and elsewhere (google search), but nothing worked. At first I've had all the code in one file and everything worked correctly. But now, I've needed to split the code into multiple files, create some classes and so on, so I've created following files:

stdafx.h

#pragma once

#include <iostream>
#include <fstream>
#include <iomanip>
#include <ctime>

// opencv
#include <opencv2/opencv.hpp>

// openpose
#include <openpose/flags.hpp>
#include <openpose/headers.hpp>

#include "driver-keypoints.h"

driver-keypoints.h

#pragma once

class DriverKeypoints
{
public:
    DriverKeypoints();

    static const int NOSE = 0;
    static const int NECK = 1;
    static const int R_SHOULDER = 2;
    static const int R_ELBOW = 3;
    static const int R_WRIST = 4;
    static const int L_SHOULDER = 5;
    static const int L_ELBOW = 6;
    static const int L_WRIST = 7;
    static const int MID_HIP = 8;
    static const int R_HIP = 9;
    static const int L_HIP = 12;

    int get_video_keypoints();

protected:
    void save_keypoints(const std::shared_ptr<std::vector<std::shared_ptr<op::Datum>>>& datums_ptr,
                        std::string out_file, bool is_first);
    void configure_wrapper(op::Wrapper& op_wrapper);
};

driver-keypoints.cpp

#include "stdafx.h"

// Custom OpenPose flags
// TODO: here should not have been an absolute path
DEFINE_string(output_path, "/path/to/output/openpose/", "Path to save required keypoints.");
DEFINE_bool(no_display, false, "Enable to disable the visual display.");

void DriverKeypoints::save_keypoints(const std::shared_ptr<std::vector<std::shared_ptr<op::Datum>>> &datums_ptr,
                                     std::string out_file, bool is_first) {
}

void DriverKeypoints::configure_wrapper(op::Wrapper &op_wrapper) {
}

int DriverKeypoints::get_video_keypoints() {
}

main.cpp

#include "stdafx.h"

int main(int argc, char** argv) {
  FLAGS_disable_multi_thread = true;

  FLAGS_net_resolution = "-1x192";
  FLAGS_number_people_max = 0;

  // Parsing command line flags
  gflags::ParseCommandLineFlags(&argc, &argv, true);

  // run parse keypoints from video
  DriverKeypoints driver_keypoints;
  return driver_keypoints.get_video_keypoints();
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.14)
project(my_project)

set(CMAKE_CXX_STANDARD 14)


find_package(OpenCV REQUIRED)
find_package(CUDA REQUIRED)
find_package(Caffe REQUIRED)
find_package(gflags REQUIRED)


include_directories(
        OpenCV_INCLUDE_DIRS
        ${CUDA_INCLUDE_DIRS}
        ${CAFFE_INCLUDE_DIRS}
)

# TODO: here should not have been an absolute path
include(/home/path_to_openpose/openpose/cmake/Utils.cmake)

set(SOURCE_FILES main.cpp driver-keypoints.cpp)
add_executable(anomalies_analysis ${SOURCE_FILES})

target_link_libraries(
        anomalies_analysis
        ${OpenCV_LIBS}
        ${CUDA_LIBRARIES}
        openpose
        gflags
)

And I am getting following errors:

CMakeFiles/anomalies_analysis.dir/driver-keypoints.cpp.o:(.data+0x0): multiple definition of `fLI::FLAGS_logging_level'
CMakeFiles/anomalies_analysis.dir/main.cpp.o:(.data+0x0): first defined here
CMakeFiles/anomalies_analysis.dir/driver-keypoints.cpp.o:(.data+0x4): multiple definition of `fLI::FLAGS_nologging_level'
CMakeFiles/anomalies_analysis.dir/main.cpp.o:(.data+0x4): first defined here
CMakeFiles/anomalies_analysis.dir/driver-keypoints.cpp.o:(.bss+0x0): multiple definition of `fLB::FLAGS_disable_multi_thread'
CMakeFiles/anomalies_analysis.dir/main.cpp.o:(.bss+0x0): first defined here
CMakeFiles/anomalies_analysis.dir/driver-keypoints.cpp.o:(.bss+0x1): multiple definition of `fLB::FLAGS_nodisable_multi_thread'
CMakeFiles/anomalies_analysis.dir/main.cpp.o:(.bss+0x1): first defined here
...

There are many answers of type:

  • you should declare something as inline (but it is not possible)
  • you should define something only once (but I think I am doing it, it looks like the problem is in including openpose/flags.hpp, but I have #pragma once in stdafx.h, so is the problem here?)

Could you please help me? I am not experienced enough in C/C++ programming. Thank you very much.

Aykhan Hagverdili
  • 28,141
  • 6
  • 41
  • 93
Honza
  • 939
  • 2
  • 11
  • 28

1 Answers1

1

I know this is late, but I had a similar issue and this thread popped up.

My code was working fine in one file, and then gave me similar errors to yours when I created a header file and #included it in multiple places. In my case, I had DEFINE_type() in my header file instead of DECLARE_type(), which caused issues since the variables were being defined more than once. I would double check that you are using the DECLARE_ methods instead of the DEFINE_ methods in your header file.

Lily
  • 41
  • 4