Простой make-файл для LibElemental

Я хотел бы использовать libElemental в качестве библиотеки после ее установки следующим образом:

git clone https://github.com/elemental/Elemental
mkdir build
cd build
cmake ../Elemental
make
make install

Установка прошла успешно, примеры собраны. У меня ограниченный опыт работы с makefile, но я бы не хотел использовать cmake, чтобы легко интегрироваться в другие приложения.

У меня есть один файл: test.cpp:

#include <El.hpp>
#include <stdlib.h>

int main(int argc, char* argv[]) {
    return 0;
}

Вот моя неудачная makefile попытка:

CFLAGS = -O3 -std=gnu++11
LDFLAGS := -lEl
CC = mpicc.mpich2
CXX = mpicxx.mpich2

all: test
test: test.cpp
    $(CXX) $(CFLAGS) $(LDFLAGS) test.cpp -o test

Вот фрагмент ошибок компоновщика, которые я получаю:

/tmp/ccgDsmEV.o: In function __static_initialization_and_destruction_0': /usr/local/include/El/number_theory/lattice/LLL.hpp:316: undefined reference to El::Timer::Timer(std::string const&)' : : /tmp/ccgDsmEV.o:/usr/local/include/El/number_theory/lattice/LLL.hpp:318: more undefined references to El::Timer::Timer(std::string const&)' follow collect2: error: ld returned 1 exit status make: *** [test] Error 1

Любая помощь или указатели, которые помогут мне решить эту проблему, очень ценятся!


person quine    schedule 04.10.2016    source источник
comment
Попробуйте $(CXX) test.cpp $(CFLAGS) $(LDFLAGS) -o test. Хотя никаких гарантий.   -  person andars    schedule 04.10.2016
comment
Возможный дубликат Как использовать LDFLAGS в make-файле   -  person Tsyvarev    schedule 04.10.2016
comment
would like to avoid using cmake so I can easily integrate elsewhere Но для этого и существует CMake.   -  person arrowd    schedule 04.10.2016
comment
Да, но у меня нет контроля над тем, с чем я сейчас интегрируюсь, и я не могу использовать cmake.   -  person quine    schedule 04.10.2016


Ответы (1)


Спасибо комментаторам @andars и @Tsyvarev за указание на мою ошибку в размещении $(LDFlAGS). Помимо этого остается только указать на динамические библиотеки, установленные libElemental. Вот окончательный make-файл:

CXX=mpicxx.mpich

LIB_PATHS:=-Wl,-rpath,/usr/local/lib/x86_64-linux-gnu:/usr/local/lib
CXXFLAGS:=-std=gnu++11 -O3
LDFLAGS:=-lEl

all: test
test: test.cpp
    $(CXX) $(CXXFLAGS) $(LIB_PATHS) test.cpp -o test $(LDFLAGS)

clean:
    rm -f test

Я также мог бы пропустить добавление $(LIB_PATHS) и просто установить LD_LIBRARY_PATH:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/x86_64-linux-gnu:/usr/local/lib

ПРИМЕЧАНИЕ: поскольку libElemental использует mpich вместо openmpi (как показано в make-файле), запускайте исполняемые файлы с mpirun.mpich вместо mpirun, иначе вы получите неопределенное поведение.

person quine    schedule 04.10.2016