PDA

View Full Version : Suggestion in library inclusion with rpath



jepessen
6th May 2011, 14:22
Hi. I'm trying of use the libmesh library in a project. When I compile a test file by hand, I use a command like this


c++ -o foo foo.C `/mylib/libmesh-config --cxxflags --include --ldflags`

when I use the --ldflags option


/mylib/libmesh-config --ldflags

I obtain something like this


/mydir/lib/x86_64-unknown-linux-gnu_dbg/libmesh.so
/mydir/contrib/lib/x86_64-unknown-linux-gnu_dbg/liblaspack.so
/mydir/contrib/lib/x86_64-unknown-linux-gnu_dbg/libparmetis.so
/mydir/contrib/lib/x86_64-unknown-linux-gnu_dbg/libmetis.so
/mydir/contrib/lib/x86_64-unknown-linux-gnu_dbg/libsfcurves.so
/mydir/contrib/lib/x86_64-unknown-linux-gnu_dbg/libgzstream.so -lz
/mydir/contrib/tecplot/lib/x86_64-unknown-linux-gnu/tecio.a
/mydir/contrib/lib/x86_64-unknown-linux-gnu_dbg/libgmv.so -Wl,-rpath,/usr/lib
-L/usr/lib -lvtkIO -lvtkCommon -lvtkFiltering -Wl,-rpath,/usr/lib
-L/usr/lib -lglpk
/mydir/contrib/lib/x86_64-unknown-linux-gnu_dbg/libtetgen.so
/mydir/contrib/lib/x86_64-unknown-linux-gnu_dbg/libtriangle.so
/mydir/contrib/lib/x86_64-unknown-linux-gnu_dbg/libexodusii.so
/mydir/contrib/lib/x86_64-unknown-linux-gnu_dbg/libnetcdf.so
/mydir/contrib/lib/x86_64-unknown-linux-gnu_dbg/libnemesis.so
/mydir/contrib/lib/x86_64-unknown-linux-gnu_dbg/libHilbert.so -Wl,-rpath,/home/daniele/programs/petsc-3.1-p8/linux-gnu-dbg/lib
-L/home/daniele/programs/petsc-3.1-p8/linux-gnu-dbg/lib -lpetsc -lX11 -Wl,-rpath,/home/daniele/programs/petsc-3.1-p8/linux-gnu-dbg/lib
-L/home/daniele/programs/petsc-3.1-p8/linux-gnu-dbg/lib -lsuperlu_4.0 -lsuperlu_dist_2.4 -lparmetis -lmetis -lHYPRE -Wl,-rpath,/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2 -Wl,-rpath,/usr/lib/x86_64-linux-gnu -lmpichcxx -lstdc++ -lspooles -lumfpack -lamd -lflapack -lfblas -lnsl -lrt -lm -Wl,-rpath,/home/daniele/programs/petsc-3.1-p8/linux-gnu-dbg/lib -L/home/daniele/programs/petsc-3.1-p8/linux-gnu-dbg/lib -Wl,-rpath,/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2 -L/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2 -Wl,-rpath,/usr/lib/x86_64-linux-gnu -L/usr/lib/x86_64-linux-gnu -ldl -lmpich -lpthread -lrt -lgcc_s -lmpichf90 -lgfortran -lm -lm -lmpichcxx -lstdc++ -ldl -lmpich -lpthread -lrt -lgcc_s -ldl -lnsl -lrt -Wl,-rpath,/mydir/lib/x86_64-unknown-linux-gnu_dbg -Wl,-rpath,/mydir/contrib/lib/x86_64-unknown-linux-gnu_dbg -Wl,-rpath,/home/daniele/programs/petsc-3.1-p8/linux-gnu-dbg/lib -Wl,-rpath,/mydir/lib/x86_64-unknown-linux-gnu_dbg -Wl,-rpath,/mydir/contrib/lib/x86_64-unknown-linux-gnu_dbg -Wl,-rpath,/home/daniele/programs/petsc-3.1-p8/linux-gnu-dbg/lib

I add these libraries using this code in the .pro file


## Adding libraries ##
unix {
TMPLIBS = $$system(/home/daniele/programs/libmesh-0.7.1/libmesh/contrib/bin/libmesh-config --ldflags)
LIBS += $$TMPLIBS
}

and, if I print the LIBS variable (using message command) I obtain:


Project MESSAGE: LIBS = /mydir/lib/x86_64-unknown-linux-gnu_dbg/libmesh.so /mydir/contrib/lib/x86_64-unknown-linux-gnu_dbg/liblaspack.so /mydir/contrib/lib/x86_64-unknown-linux-gnu_dbg/libparmetis.so /mydir/contrib/lib/x86_64-unknown-linux-gnu_dbg/libmetis.so /mydir/contrib/lib/x86_64-unknown-linux-gnu_dbg/libsfcurves.so /mydir/contrib/lib/x86_64-unknown-linux-gnu_dbg/libgzstream.so -lz /mydir/contrib/tecplot/lib/x86_64-unknown-linux-gnu/tecio.a /mydir/contrib/lib/x86_64-unknown-linux-gnu_dbg/libgmv.so -Wl,-rpath,/usr/lib -L/usr/lib -lvtkIO -lvtkCommon -lvtkFiltering -Wl,-rpath,/usr/lib -L/usr/lib -lglpk /mydir/contrib/lib/x86_64-unknown-linux-gnu_dbg/libtetgen.so /mydir/contrib/lib/x86_64-unknown-linux-gnu_dbg/libtriangle.so /mydir/contrib/lib/x86_64-unknown-linux-gnu_dbg/libexodusii.so /mydir/contrib/lib/x86_64-unknown-linux-gnu_dbg/libnetcdf.so /mydir/contrib/lib/x86_64-unknown-linux-gnu_dbg/libnemesis.so /mydir/contrib/lib/x86_64-unknown-linux-gnu_dbg/libHilbert.so -Wl,-rpath,/home/daniele/programs/petsc-3.1-p8/linux-gnu-dbg/lib -L/home/daniele/programs/petsc-3.1-p8/linux-gnu-dbg/lib -lpetsc -lX11 -Wl,-rpath,/home/daniele/programs/petsc-3.1-p8/linux-gnu-dbg/lib -L/home/daniele/programs/petsc-3.1-p8/linux-gnu-dbg/lib -lsuperlu_4.0 -lsuperlu_dist_2.4 -lparmetis -lmetis -lHYPRE -Wl,-rpath,/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2 -Wl,-rpath,/usr/lib/x86_64-linux-gnu -lmpichcxx -lstdc++ -lspooles -lumfpack -lamd -lflapack -lfblas -lnsl -lrt -lm -Wl,-rpath,/home/daniele/programs/petsc-3.1-p8/linux-gnu-dbg/lib -L/home/daniele/programs/petsc-3.1-p8/linux-gnu-dbg/lib -Wl,-rpath,/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2 -L/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2 -Wl,-rpath,/usr/lib/x86_64-linux-gnu -L/usr/lib/x86_64-linux-gnu -ldl -lmpich -lpthread -lrt -lgcc_s -lmpichf90 -lgfortran -lm -lm -lmpichcxx -lstdc++ -ldl -lmpich -lpthread -lrt -lgcc_s -ldl -lnsl -lrt -Wl,-rpath,/mydir/lib/x86_64-unknown-linux-gnu_dbg -Wl,-rpath,/mydir/contrib/lib/x86_64-unknown-linux-gnu_dbg -Wl,-rpath,/home/daniele/programs/petsc-3.1-p8/linux-gnu-dbg/lib -Wl,-rpath,/mydir/lib/x86_64-unknown-linux-gnu_dbg -Wl,-rpath,/mydir/contrib/lib/x86_64-unknown-linux-gnu_dbg -Wl,-rpath,/home/daniele/programs/petsc-3.1-p8/linux-gnu-dbg/lib

But, in these case, it yet fails to load some library. Without this code, I got a lot of compiler error (about 50), while using this code errors (all of the type "undefined reference") are only 4, but not zero.

I've seen in the variale something like -rpath with commas around it, and I don't know what's this. I don't know if this is the cause of my error, and I'd like to know how insert all libraries in a correct way.

Thanks in advance for your reply

ChrisW67
8th May 2011, 05:03
You are doing the correct thing. You are missing a library from the list, or the library no longer exists where the config says it does, but since you don't tell us what the error messages are we cannot even guess what it might be.

The -rpath setting adds a directory to the runtime library search path (which can have problems after deployment) but should have no effect at build time.

jepessen
9th May 2011, 09:07
Ok, I'll be more explicit...

I compile manually the main.cpp of the project with this command:


c++ -o test main.cpp `/home/daniele/programs/libmesh-0.7.1/libmesh/contrib/bin/libmesh-config --cxxflags --include --ldflags`

I obtain only some warning (unused parameter of the library), but with this command program compiles and the executable file works well.

The complete .pro file of my project is this one:


#-------------------------------------------------
#
# Project created by QtCreator 2011-05-04T12:27:57
#
#-------------------------------------------------
QT += core

QT -= gui

TARGET = test
CONFIG += console
CONFIG -= app_bundle

TEMPLATE = app



SOURCES += main.cpp

#-------------------------------------------------
# Adding libmesh library
#-------------------------------------------------

## Adding include paths ##
unix {
TMPPATHS = $$system(/home/daniele/programs/libmesh-0.7.1/libmesh/contrib/bin/libmesh-config --include)
INCLUDEPATH += $$replace(TMPPATHS, "-I", "")
}

# Printing paths
message(INCLUDEPATH = $$INCLUDEPATH)

## Adding libraries ##
unix {

TMPLIBS = $$system(/home/daniele/programs/libmesh-0.7.1/libmesh/contrib/bin/libmesh-config --ldflags)
LIBS += $$TMPLIBS

}

# Printing libs
message($$LIBS)

## Adding compiler flags ##
unix {
QMAKE_CXXFLAGS += $$system(/home/daniele/programs/libmesh-0.7.1/libmesh/contrib/bin/libmesh-config --cxxflags)
}


The compile output error is this one:


main.o: In function `main':
/home/daniele/Documenti/qt/test/test-build-desktop/../test/main.cpp:38: undefined reference to `libMesh::System::add_variable(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, libMeshEnums::Order, libMeshEnums::FEFamily, std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char> > const*)'
main.o: In function `assemble_1D(libMesh::EquationSystems&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
/home/daniele/Documenti/qt/test/test-build-desktop/../test/main.cpp:125: undefined reference to `libMesh::DofMap::dof_indices(libMesh::Elem const*, std::vector<unsigned int, std::allocator<unsigned int> >&, unsigned int) const'
/home/daniele/Documenti/qt/test/test-build-desktop/../test/main.cpp:162: undefined reference to `libMesh::DofMap::constrain_element_matrix_and_vec tor(libMesh::DenseMatrix<double>&, libMesh::DenseVector<double>&, std::vector<unsigned int, std::allocator<unsigned int> >&, bool) const'
main.o: In function `libMesh::MeshOutput<libMesh::MeshBase>::write_equation_systems(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, libMesh::EquationSystems const&)':
/home/daniele/Documenti/qt/test/test-build-desktop/../../../../programs/libmesh-0.7.1/libmesh/include/mesh/mesh_output.h:233: undefined reference to `libMesh::MeshOutput<libMesh::MeshBase>::_build_variable_names_and_solution_vector(libMes h::EquationSystems const&, std::vector<double, std::allocator<double> >&, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&)'
main.o:(.rodata._ZTVN7libMesh16StatisticsVectorIfE E[vtable for libMesh::StatisticsVector<float>]+0x70): undefined reference to `libMesh::StatisticsVector<float>::histogram(std::vector<unsigned int, std::allocator<unsigned int> >&, unsigned int)'
main.o:(.rodata._ZTVN7libMesh16StatisticsVectorIfE E[vtable for libMesh::StatisticsVector<float>]+0x78): undefined reference to `libMesh::StatisticsVector<float>::histogram(std::vector<unsigned int, std::allocator<unsigned int> >&, unsigned int) const'
main.o:(.rodata._ZTVN7libMesh6FEBaseE[vtable for libMesh::FEBase]+0x68): undefined reference to `libMesh::FEBase::compute_map(std::vector<double, std::allocator<double> > const&, libMesh::Elem const*)'
main.o:(.rodata._ZTVN7libMesh6FEBaseE[vtable for libMesh::FEBase]+0x70): undefined reference to `libMesh::FEBase::compute_affine_map(std::vector<double, std::allocator<double> > const&, libMesh::Elem const*)'
collect2: ld returned 1 exit status
make: Leaving directory `/home/daniele/Documenti/qt/test/test-build-desktop'
make: *** [test] Error 1
The process "/usr/bin/make" exited with code 2.
Error while building project test (target: Desktop)
When executing build step 'Make'

If I search the method of the last error, for example (compute_affine_map) I find it in the fe_base.h file, that's in the libmesh-0.7.1/libmesh/src/fe path, that's included in the INCLUDEDPATH variable, as you can see in the .pro message below.


Project MESSAGE: INCLUDEPATH = /home/daniele/programs/libmesh-0.7.1/libmesh/include/base /home/daniele/programs/libmesh-0.7.1/libmesh/include/enums /home/daniele/programs/libmesh-0.7.1/libmesh/include/error_estimation /home/daniele/programs/libmesh-0.7.1/libmesh/include/fe /home/daniele/programs/libmesh-0.7.1/libmesh/include/geom /home/daniele/programs/libmesh-0.7.1/libmesh/include/mesh /home/daniele/programs/libmesh-0.7.1/libmesh/include/numerics /home/daniele/programs/libmesh-0.7.1/libmesh/include/parallel /home/daniele/programs/libmesh-0.7.1/libmesh/include/partitioning /home/daniele/programs/libmesh-0.7.1/libmesh/include/quadrature /home/daniele/programs/libmesh-0.7.1/libmesh/include/solvers /home/daniele/programs/libmesh-0.7.1/libmesh/include/systems /home/daniele/programs/libmesh-0.7.1/libmesh/include/utils /home/daniele/programs/libmesh-0.7.1/libmesh/contrib/boost /home/daniele/programs/libmesh-0.7.1/libmesh/contrib/laspack /home/daniele/programs/libmesh-0.7.1/libmesh/contrib/parmetis/Lib /home/daniele/programs/libmesh-0.7.1/libmesh/contrib/metis/Lib /home/daniele/programs/libmesh-0.7.1/libmesh/contrib/sfcurves /home/daniele/programs/libmesh-0.7.1/libmesh/contrib/gzstream /home/daniele/programs/libmesh-0.7.1/libmesh/contrib/tecplot/include /home/daniele/programs/libmesh-0.7.1/libmesh/contrib/gmv /usr/include/vtk-5.4 /usr/include /home/daniele/programs/libmesh-0.7.1/libmesh/contrib/tetgen /home/daniele/programs/libmesh-0.7.1/libmesh/contrib/triangle /home/daniele/programs/libmesh-0.7.1/libmesh/contrib/exodusii/Lib/include /home/daniele/programs/libmesh-0.7.1/libmesh/contrib/netcdf/Lib /home/daniele/programs/libmesh-0.7.1/libmesh/contrib/nemesis/Lib /home/daniele/programs/libmesh-0.7.1/libmesh/contrib/libHilbert/include /home/daniele/programs/petsc-3.1-p8/include /home/daniele/programs/petsc-3.1-p8/bmake/linux-gnu-dbg /home/daniele/programs/petsc-3.1-p8/linux-gnu-dbg/include /home/daniele/programs/petsc-3.1-p8/linux-gnu-dbg/include /home/daniele/programs/petsc-3.1-p8/linux-gnu-dbg/include /home/daniele/programs/petsc-3.1-p8/linux-gnu-dbg/include

Have you any suggestion, please?

Added after 28 minutes:

Ok, now it seems to work. It seems that I had to clear and rebuild the project...

Thank you very much!!!