В настоящее время я пытаюсь разработать приложение на C ++, которое будет включать решение некоторых алгебраических задач (таких как дифференцирование или интеграция) с использованием GiNaC; Сначала я установил его из Ubuntu Software Center (Ubuntu 13.04), а затем прямо с ftp ftp://ftpthep.physik.uni-mainz.de/pub/GiNaC/ ; однако каждый раз я пытаюсь скомпилировать следующий пример программы:
#include <iostream>
#include <ginac/ginac.h>
using namespace std;
using namespace GiNaC;
int main()
{
symbol x("x"), y("y");
ex poly;
for (int i=0; i<3; ++i)
poly += factorial(i+16)*pow(x,i)*pow(y,2-i);
cout << poly << endl;
return 0;
}
я получаю список ошибок, все начинающиеся с «неопределенной ссылки на GiNaC ::». Я проверил, что cln также установлен и файлы заголовков находятся по умолчанию. Также при компиляции я использовал команду g++ -o simple pkg-config --cflags --libs ginac simple.cpp
а также g++ -o simple -lginac -lcln simple.cpp
оба не смогли скомпилировать.
Проблема заключается в порядке параметров в строке компиляции. Попробуйте один из следующих двух вариантов:
g++ -o simple simple.cpp `pkg-config --cflags --libs ginac`
g++ -o simple -Wl,--no-as-needed `pkg-config --cflags --libs ginac` simple.cpp
Идея заключается в том, что порядок работы с объектными файлами и библиотеками важен для компоновщика. Проще говоря, по умолчанию он связывает библиотеку только в том случае, если это необходимо для разрешения некоторых ранее неразрешенных символов.
Первый вариант выше перемещает библиотеки в конце параметров сборки (то есть после объектного файла для вашего кода), в то время как второй вариант отключает это поведение в компоновщике.
Я столкнулся с той же самой проблемой, и я нашел 2 вещи, которые приведут вас туда, где вы хотите быть:
-lcln
после -lginac
в командной строкеЭто позволило мне скомпилировать его, но программа не запустилась. Я нашел решение для этого. Ошибка была "GLIB_CXX_3.4.21 not defined in libstdc++.so.6 with link time reference"
libstdc++
с -static-libstdc++
Как в:
g++ -g testgin.cpp -o simple -lcln -lginac -static-libstdc++
мир