компиляция c ++: что я сделал не так - PullRequest
4 голосов
/ 17 июня 2011

Я новичок в c ++, и я начал проект для моей стажировки, где я использую библиотеку Snap из Стэнфорда (http://snap.stanford.edu/).). Итак, я скачал библиотеку и сейчас пытаюсь создать моя собственная маленькая программа использует его. К сожалению, я не могу скомпилировать его: (

Вот источники:

Makefile:

CXXFLAGS += -std=c++98 -Wall
LDFLAGS += -lrt

Snap.o :
    g++ -c  $(CXXFLAGS) ../snap/snap/Snap.cpp -I../snap/glib -I../snap/snap -pg
simulation.o : simulation.cpp simulation.h
            g++ -g -c $(CXXFLAGS) simulation.cpp
test.o : test.cpp
            g++ -g -c $(CXXFLAGS) test.cpp
test : test.o Snap.o simulation.o
            g++ -g $(LDFLAGS) test.o Snap.o simulation.o -I../snap/glib -I../snap/snap -lm -o test

simulation.h

#ifndef SIMULATION
#define SIMULATION
#include <vector>
#include "../snap/snap/Snap.h"
class Simulation{
    public:
        Simulation():score(-1),nNodes(-1),nEdges(-1), dMax(-1){};
        Simulation(int nN, int nE, int d);
        Simulation(int d, PUNGraph g);
        void setDMax(int d){ dMax = d; }
        double getScore(){ return score; }
        int getNNodes(){ return nNodes; }
        int getNEdges(){ return nEdges; }
        int getDMax(){ return dMax; }
        PUNGraph getGraph(){ return graph; }
        std::vector<int> getAlignment(){ return alignment; }
        double computeEnergy();
    private:
        double score;
        int nNodes;
        int nEdges;
        int dMax;
        PUNGraph graph;
        std::vector<int> alignment;
};
#endif

simulation.cpp

#include "simulation.h"
#include <stdlib.h>
#include <stdio.h>
#include <vector>
#include <algorithm>
#include "../snap/snap/Snap.h"
Simulation::Simulation(int nN, int nE, int d){
    nNodes = nNodes;
    nEdges = nEdges;
    dMax = dMax;
    graph = TSnap::GenRdnGnm<PUNGraph>(nNodes,nEdges);
    for(int i=1; i<=nNodes; i++){
        alignment.push_back(i);
    }
    random_shuffle(alignment.begin(),alignment.begin()+nNodes);
    computeEnergy();
}

Simulation::Simulation(int d, PUNGraph g){
    nNodes = graph->GetNodes();
    nEdges = graph->GetEdges();
    dMax = d;
    graph = g;
    for(int i=1; i<=nNodes; i++){
        alignment.push_back(i);
    }
    random_shuffle(alignment.begin(),alignment.begin()+nNodes);
    computeEnergy();
}

double computeEnergy(){
    return 0.0;
}

test.cpp

#include<stdlib.h>
#include<stdio.h>
#include<vector>
#include<algorithm>
#include "simulation.h"
#include "../snap/snap/Snap.h"


int main(int argc, char** argv){
    Simulation sim(5000,30000,30);
}

Я не думаю, что мои проблемы с компиляцией связаны с самой Snap, и вполне может быть, что это только из-за моего плохого знания c ++ и того, как работает include и так далее.

Вот что я получаю после запуска make:

g++ -g -c -std=c++98 -Wall simulation.cpp
In file included from /usr/include/c++/4.5/bits/stl_algo.h:61:0,
                 from /usr/include/c++/4.5/algorithm:63,
                 from simulation.cpp:5:
/usr/include/c++/4.5/bits/algorithmfwd.h:347:41: error: macro "max" passed 3 arguments, but takes just 2
/usr/include/c++/4.5/bits/algorithmfwd.h:358:41: error: macro "min" passed 3 arguments, but takes just 2
/usr/include/c++/4.5/bits/algorithmfwd.h:343:5: error: expected unqualified-id before ‘const’
/usr/include/c++/4.5/bits/algorithmfwd.h:343:5: error: expected ‘)’ before ‘const’
/usr/include/c++/4.5/bits/algorithmfwd.h:343:5: error: expected ‘)’ before ‘const’
/usr/include/c++/4.5/bits/algorithmfwd.h:343:5: error: expected initializer before ‘const’
/usr/include/c++/4.5/bits/algorithmfwd.h:347:5: error: template declaration of ‘const _Tp& std::max’
/usr/include/c++/4.5/bits/algorithmfwd.h:354:5: error: expected unqualified-id before ‘const’
/usr/include/c++/4.5/bits/algorithmfwd.h:354:5: error: expected ‘)’ before ‘const’
/usr/include/c++/4.5/bits/algorithmfwd.h:354:5: error: expected ‘)’ before ‘const’
/usr/include/c++/4.5/bits/algorithmfwd.h:354:5: error: expected initializer before ‘const’
/usr/include/c++/4.5/bits/algorithmfwd.h:358:5: error: template declaration of ‘const _Tp& std::min’
In file included from /usr/include/c++/4.5/algorithm:63:0,
                 from simulation.cpp:5:
/usr/include/c++/4.5/bits/stl_algo.h: In function ‘void std::__merge_sort_loop(_RandomAccessIterator1, _RandomAccessIterator1, _RandomAccessIterator2, _Distance)’:
/usr/include/c++/4.5/bits/stl_algo.h:3172:26: error: expected unqualified-id before ‘(’ token
/usr/include/c++/4.5/bits/stl_algo.h: In function ‘void std::__merge_sort_loop(_RandomAccessIterator1, _RandomAccessIterator1, _RandomAccessIterator2, _Distance, _Compare)’:
/usr/include/c++/4.5/bits/stl_algo.h:3202:26: error: expected unqualified-id before ‘(’ token
simulation.cpp: In constructor ‘Simulation::Simulation(int, int, int)’:
simulation.cpp:11:13: error: ‘GenRdnGnm’ is not a member of ‘TSnap’
simulation.cpp:11:38: error: expected primary-expression before ‘>’ token
simulation.cpp:11:47: warning: left-hand operand of comma has no effect

Я был бы очень рад, если бы кто-нибудь помог мне решить мои проблемы (и если бы вы почувствовали, что вам нужно немного поработать над c ++ / программированием, я был бы еще счастливее :))

Ortholle

Ответы [ 2 ]

11 голосов
/ 17 июня 2011

Заголовки библиотеки Snap содержат неудачные определения макросов:

#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))

Это вызовет проблемы с кодом, который использует (или определяет) std::min и std::max.

Вы можете обойти это, включив заголовки STL перед Snap, или, возможно, добавив

#undef min
#undef max

после включения заголовка Snap.h.

1 голос
/ 17 июня 2011

Еще одна проблема с вашим кодом: что со всеми этими посторонними #include?Пример: ваш test.cpp # включает в себя целую кучу вещей, которые ему не нужны.Все, что нужно test.cpp - это (или нужно) имитация.Схожая проблема для model.cpp: слишком много # включает.

Не включайте в файл что-то, что не используется в этом файле.

(За исключением: этот random_shuffle вSimulation.cpp должен быть std :: random_shuffle).

Ни одно из этих исправлений не поможет решить базовую проблему, заключающуюся в том, что библиотека Snap «удобно» определяет max и min как макросы.Тебе они не нужны, поэтому откажись от них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...