Пространство имен C ++ и связывание не работает - PullRequest
0 голосов
/ 23 мая 2018

Обновление: исправлено.Очень простое решениеЯ просто должен добавить в свой метод Add_Executable.Здесь:

add_executable (POC eb_pms.cpp url_binder.cpp)

Так что эта проблема выглядит довольно маленькой, но я не могу найти никакого решения этой проблемы.Или, я должен сказать, ни одна из статей не объясняет это так просто, чтобы я мог понять.Я пришел со строго типизированного фона, как C # / Java.Я пытаюсь создать Rest API в C ++ 11, используя Простой веб-сервер и RapidJSON .Поскольку мы строим этот проект как часть более крупного решения, я не могу использовать командную строку, чтобы связать программу.Я должен использовать CMakeLists для компиляции и запуска программы.Это означает, что связывание должно быть сделано через файл CMakeLists.txt.Весь исходный код можно найти здесь: GitHub .Моя среда - Macbook Pro + VS Code.Итак, у меня есть два CPP: eb_pms.cpp, url_binder.cpp.У urlbinder есть пространство имен 'EBPMS', а у eb_pms - нет.Ниже приведен код ep_pms:

(заголовочный файл)

#include "server_http.hpp"
#include "client_http.hpp" //client for testing the API code
#include <boost/property_tree/ptree.hpp> /*for the shared pointer*/
#include "url_binder.h"
using HttpServer = SimpleWeb::Server<SimpleWeb::HTTP>;
using HttpClient = SimpleWeb::Client<SimpleWeb::HTTP>;
using Binder = EBPMS::URLBinder;
void bindUrls(HttpServer *server);

cpp файл:

# include "eb_pms.h"
using namespace boost::property_tree;
using namespace std;
using namespace EBPMS;
int main(){
    HttpServer server;
    server.config.port = 8081;
    bindUrls(&server);
    thread server_thread([&server]() {
        server.start();
  });
  server_thread.join();
}
void bindUrls(HttpServer *server){
    //URLBinder c;
    Binder binder; 
    binder.bindURL_string();
}

подвязка URL h:

#include <boost/property_tree/ptree.hpp> /*for the shared pointer*/
#include "server_http.hpp"
#include "client_http.hpp" 
#include <iostream>
namespace EBPMS{
    class URLBinder{
        public: URLBinder();
        void bindURL_string();
    }; 
} 

url binder cpp;

#include "url_binder.h"
using namespace boost::property_tree;
using namespace std;

namespace EBPMS{
    URLBinder::URLBinder() {}
    void URLBinder::bindURL_string(){ //HttpServer *server
        std::cout << "Trying to log if it comes" << std::endl;
    }
}

Итак, все, что мне нужно, это найти способ связать этот файл с NameSpace с моим оригинальным cpp, чтобы я мог использовать метод из url binder внутри моего основного cppучебный класс.Я пытаюсь вызвать функцию в классе eb_pms.cpp.Когда я запускаю команду make, я получаю эту ошибку:

Scanning dependencies of target POC
[  2%] Building CXX object CMakeFiles/POC.dir/eb_pms.cpp.o
[  5%] Linking CXX executable POC
Undefined symbols for architecture x86_64:
"EBPMS::URLBinder::bindURL_string()", referenced from: _main in eb_pms.cpp.o
      bindUrls(SimpleWeb::Server<boost::asio::basic_stream_socket<boost::asio::ip::tcp>> >*) in eb_pms.cpp.o
"EBPMS::URLBinder::URLBinder()", referenced from: _main in eb_pms.cpp.o
  bindUrls(SimpleWeb::Server<boost::asio::basic_stream_socket<boost::asio::ip::tcp>> >*) in eb_pms.cpp.o
ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [POC] Error 1
make[1]: ***
[CMakeFiles/POC.dir/all] Error 2
make: *** [all] Error 2

Прошло несколько часов с тех пор, как я пытался исследовать.Но я не могу найти этот недостающий кусок.Любая помощь будет оценена.

1 Ответ

0 голосов
/ 23 мая 2018

Я просто догадываюсь здесь, так как вы не показываете свой CMakeLists.txt файл ...

Я бы сказал, что вы не перечислите свой url_binder.cpp файл какисточник в команде CMake add_executable.

Все исходные файлы, которые вы хотите включить в свою программу, должны быть перечислены.

...