Неопределенная ссылка на (ошибка) в C++ Eclipse, но работает в Visual Studio 2015

Я пытаюсь интегрировать AMPL с C/C++, используя AMPL-API на Windows-7 в Eclipse Mars 2.0. Я создал проект Makefile в Eclipse, который использует MinGW CC для компиляции первого кода примера, приведенного в их каталоге примеров.

firstexample.cpp:

#include <iostream>
#include "ampl/ampl.h"

using namespace std;

    int main() {
        ampl::AMPL ampl;

        // Read the model and data files.
        std::string modelDirectory = "models";
        ampl.read(modelDirectory + "/diet/diet.mod");
        ampl.readData(modelDirectory + "/diet/diet.dat");

        // Solve
        ampl.solve();

        // Get objective entity by AMPL name
        ampl::Objective totalcost = ampl.getObjective("total_cost");
        // Print it
        std::cout << "Objective is: " << totalcost.value() << std::endl;
        // Get objective entity by AMPL name
        ampl::Objective totalcost = ampl.getObjective("total_cost");
        // Print it
        std::cout << "Objective is: " << totalcost.value() << std::endl;

        // Reassign data - specific instances
        ampl::Parameter cost = ampl.getParameter("cost");
        cost.setValues(new Tuple[2]{ ampl::Arg("BEEF"),  ampl::Arg("HAM")}, new Arg[2]{ 5.01, 4.55 },
                                   2);
        std::cout << "Increased costs of beef and ham." << std::endl;

        // Resolve and display objective
        ampl.solve();
        std::cout << "New objective value: " << totalcost.value() << std::endl;

        // Reassign data - all instances
        ampl::Arg elements[8]{ 3, 5, 5, 6, 1, 2, 5.01, 4.55 };
        cost.setValues(elements);

        std::cout << "Updated all costs." << std::endl;

        // Resolve and display objective
        ampl.solve();
        std::cout << "New objective value: " << totalcost.value() << std::endl;

        // Get the values of the variable Buy in a dataframe object
        Variable buy = ampl.getVariable("Buy");
        ampl::DataFrame df;
        df = buy.getValues();
        // Print them
        df.print();
        ampl::DataFrame df2;
        // Get the values of an expression into a DataFrame object
        df2 = ampl.getData("{j in FOOD} 100*Buy[j]/Buy[j].ub");
        // Print them
        df2.print();
}

Ниже мой Makefile:

CC = g++

CFLAGS = -O2 -g -Wall -fmessage-length=0

INCLUDES = -I "C:\\Local\\AMPL\\AMPL32\\amplapi32\\include"

OBJS = AMPL.o

LFLAGS = -L "C:\\Local\\AMPL\\AMPL32\\amplapi32\\lib"

LIBS =  -lampl1.2.2 

TARGET = AMPL.exe

$(TARGET):  $(OBJS)
    $(CC) $(CFLAGS) $(INCLUDES) -o $(TARGET) $(OBJS) $(LFLAGS) $(LIBS)

AMPL.o: AMPL.cpp
    $(CC) $(CFLAGS) $(INCLUDES) -c AMPL.cpp

all:    $(TARGET)

clean:
    rm -f $(OBJS) $(TARGET)

Я добавил путь к необходимым DLL-файлам (libampl1.2.2.dll) к переменным окружения. Я могу скомпилировать и выполнить код в Visual Studio 2015 с двумя небольшими изменениями:

  • Без использования Makefile (это консольное приложение Win32)
  • Добавление #include "stdafx.h" в firstexample.cc

Однако, когда я выполняю тот же код в Eclipse, он дает мне следующую ошибку:

src\AMPLTesting.o: In function `ZN4ampl8internal11deleteTupleERNS0_5TupleE':
C:/Local/AMPL/AMPL32/amplapi32/include/ampl/ep/tuple_ep.h:24: undefined reference to `_imp___ZN4ampl8internal24AMPL_Variant_DeleteArrayEPKNS0_7VariantE'
src\AMPLTesting.o: In function `ZN4ampl8internal12TupleBuilderC1Ej':
C:/Local/AMPL/AMPL32/amplapi32/include/ampl/ep/tuple_ep.h:35: undefined reference to `_imp___ZN4ampl8internal24AMPL_Variant_CreateArrayEjPNS0_16ErrorInformationE'
collect2.exe: error: ld returned 1 exit status

Я не уверен, в чем проблема? Я пропускаю какой-либо параметр командной строки в Makefile или не добавляю какую-либо конкретную библиотеку? Пожалуйста, помогите мне с этим.

1 ответ

Бета-версия C++ API в настоящее время поддерживает только MSVC для Windows. Поддержка других компиляторов будет добавлена ​​в следующих выпусках.

Другие вопросы по тегам