Простой makefile для 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

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

1 ответ

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

    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(Как видно из файла makefile), запустите исполняемые файлы с mpirun.mpichвместо just mpirunили вы получите неопределенное поведение.