LibElemental 的简单 makefile
Simple makefile for 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
非常感谢能帮助我解决此问题的任何帮助或指示!
感谢评论者@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
而不是 mpirun
否则你会得到未定义的行为。
我想在安装后将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
非常感谢能帮助我解决此问题的任何帮助或指示!
感谢评论者@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
而不是 mpirun
否则你会得到未定义的行为。