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
instdafx.h
, so is the problem here?)
Could you please help me? I am not experienced enough in C/C++ programming. Thank you very much.