Неопределенная ссылка C ++ и openMPI - PullRequest
0 голосов
/ 09 июля 2020

это практика для университета. Я все время получаю «неопределенную ссылку», когда пытаюсь скомпилировать и не понимаю, в чем моя ошибка. Мы работаем с машинами openMPI и amazon EC2 для распределенных вычислений. У меня действительно нет опыта работы с распределенными вычислениями или использования этой парадигмы программирования, мой профессор не отвечает на мои электронные письма, и мой крайний срок - три дня.

Я искал в Интернете и не нашел все, что могло бы мне помочь. Это результат, который я получаю при попытке скомпилировать:

[ 77%] Linking CXX executable http_server
CMakeFiles/http_server.dir/httpserver.cpp.o: In function `httpServer::resolveRequests(int)':
/home/ubuntu/http_server/httpserver.cpp:410: undefined reference to `filemanager_stub::filemanager_stub(char*, char*)'
/home/ubuntu/http_server/httpserver.cpp:464: undefined reference to `filemanager_stub::filemanager_stub(char*, char*)'
collect2: error: ld returned 1 exit status
CMakeFiles/http_server.dir/build.make:226: recipe for target 'http_server' failed
make[2]: *** [http_server] Error 1
CMakeFiles/Makefile2:141: recipe for target 'CMakeFiles/http_server.dir/all' failed
make[1]: *** [CMakeFiles/http_server.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2
ubuntu@:~/http_server/build$ 

У меня есть один httpserver. cpp, работающий на одном компьютере, который отображает простой html, где я могу выбрать, какой процесс я хочу для запуска (этот процесс будет запущен на другом компьютере). У меня проблемы с одним конкретным процессом, «файловым менеджером».

Я управляю запросом POST, и мы попали сюда, это на httpserver. cpp:

if(filemanager != NULL)
{

    FILE *fp;
    std::string copyFiles = "scp -i ~/cluster_pem2.pem.txt  ~/http_server/build/rpc_filemanager ubuntu@" + 
                    std::string(ip_machine)+":/home/ubuntu/";

    fp = popen(copyFiles.c_str(), "r");
    pclose(fp);

    this->file_manager = new filemanager_stub(ip_machine, "/home/ubuntu");

}

Четыре первые строки предназначены для копирования процесса на машину, на которой я хочу запустить процесс, эти строки работают нормально и не имеют никаких проблем. Следующая строка - это проблема. Я получаю вышеуказанный результат. this->file_manager объявлен в http_server.h следующим образом: filemanager_stub* file_manager = nullptr; ip_machine - это место, где я фиксирую машину, на которой будет выполняться процесс. объявлен несколькими строками выше следующим образом: char ip_machine[64]; Теперь заголовок filemanager_stub:

#ifndef FILEMANAGER_STUB_H
#define FILEMANAGER_STUB_H
#include "mpi_manager.h"


class filemanager_stub
{
    MPI_Comm* comm;
public:
    filemanager_stub(char* ip,char* dir);
    std::vector<std::string*>* listFiles();
    void readFile(char* fileName, char** data, unsigned int* dataLength);
    void writeFile(char* fileName, char* data, unsigned int dataLength);
    ~filemanager_stub();
};

#endif // FILEMANAGER_STUB_H

Я не знаю, интересен ли CMakeFile для этой ошибки, но вот он:

cmake_minimum_required(VERSION 3.5)

project(http_server LANGUAGES CXX)

set (PROJECT_HTTPSERVER http_server)
set (PROJECT_PRUEBACLASE rpc_pruebaclase)
set (PROJECT_REMOTEFILE rpc_remotefile)
set (PROJECT_FILEMANAGER rpc_filemanager)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_BUILD_TYPE Debug)

project(${PROJECT_HTTPSERVER})
add_executable(${PROJECT_HTTPSERVER} "pruebaclase_stub.h" "pruebaclase_stub.cpp" "mpi_manager.h" "mpi_manager.cpp" "remotefile_stub.cpp"
                "remotefile_stub.h" "main.cpp" "httpserver.cpp" "httpserver.h" "utils.cpp" "utils.h")

project(${PROJECT_PRUEBACLASE})
add_executable(${PROJECT_PRUEBACLASE} "main_slave.cpp" "pruebaclase_imp.h" "pruebaclase_imp.cpp" "pruebaclase.h" "pruebaclase.cpp"
                "mpi_manager.h" "mpi_manager.cpp")

project(${PROJECT_REMOTEFILE})
add_executable(${PROJECT_REMOTEFILE} "main_remotefile.cpp" "mpi_manager.h" "mpi_manager.cpp" "remotefile.h" "remotefile.cpp"
                "remotefile_imp.cpp" "remotefile_imp.h")

project(${PROJECT_FILEMANAGER})
add_executable(${PROJECT_FILEMANAGER} "main_fm.cpp" "filemanager.h" "filemanager.cpp"
               "filemanager_imp.h" "filemanager_imp.cpp" "mpi_manager.h" "mpi_manager.cpp")

find_package(MPI REQUIRED)
include_directories(${MPI_INCLUDE_PATH})
target_link_libraries(${PROJECT_HTTPSERVER} ${MPI_LIBRARIES})
target_link_libraries(${PROJECT_PRUEBACLASE} ${MPI_LIBRARIES})
target_link_libraries(${PROJECT_REMOTEFILE} ${MPI_LIBRARIES})
target_link_libraries(${PROJECT_FILEMANAGER} ${MPI_LIBRARIES})

target_link_libraries(http_server pthread m rt atomic dl)

Вы можете увидеть 3 процесса, кроме httpserver, prueblaclase и remotefile работают оба, проблема в последнем.

Я компилирую на машине amazon ec2 с командами cmake и make. Я думаю, что код понятен, я старался писать как можно меньше, пожалуйста, на этом этапе я не пытаюсь сделать эффективный код, я просто хочу, чтобы он работал.

Спасибо.

...