How to link c++ to OpenBlas? - c++

I installed OpenBlas and could compile C programs linked to OpenBlas by using
gcc testOpenBlas.c -I /opt/OpenBLAS/include/ -L/opt/OpenBLAS/lib -lopenblas
If I try to link c++ programs using g++ and the same linker options I get the error:
testOpenBlas.cpp:1:28: fatal error: OpenBlas/cblas.h: No such file or directory
#include <OpenBlas/cblas.h>
Any hints?

Here is what I did:
I had to recompile OpenBlas again with g++.
I found that the common.h file exists in the source folder, so I had to include it instead of the installation folder '/opt/OpenBlas'. I still use '-L/opt/OpenBLAS/lib' flag.
Then the problem was solved.

This include directive is looking for the path OpenBlas/cblas.h in all your include directories, in particular also in /opt/OpenBLAS/include/.
So the question is: does there exist a file /opt/OpenBLAS/include/OpenBlas/cblas.h?
Also I think you might have to specify the -I flag before the source file.

Related

Can't link a static binary to #include it

Good day,
I have a file that I'm trying to compile and within it has an #include to a statically linked binary.
#!/bin/bash
g++ -Wall -std=c++17 Message.cpp ../textmagic-rest-cpp/lib/libtextmagic.a
I am getting the following error: fatal error: libtextmagic.h: No such file or directory
The relative path that I provided is correct under the assumption that the current working directory is the directory in which the script is called/ran. I might be linking the binary incorrectly and I've searched around the internet but the other posts/resources did not help me.
Note that the script is run in the same directory as Message.cpp.
g++ has the -I and -L flags that do that for you. Your flag will look like this: -I/ThePathToYourHeaders and -L/ThePathToYourLib. I don't know if g++ supports relative paths there but absolut paths are guaranteed to work there.
Also you probably need to add a linker flag. For your project it will be -ltextmagic. It is just the name of the .a file you want to link with, without the lib in front of the filename.
The #include directive needs to "read" the header file you give it as argument, and that is not included in the static library.
You can either include using a relative path to the source file or pass the location of the header file to the compiler using the -I argument.

Fatal error: no such file or directory

I have downloaded the source code to do some benchmark for couple of C++ library. I don't have much knowledge in C++. I downloaded the libraries. When I try to compile the code
g++ test_matrix_pseudoinverse.cpp -o test_matrix_pseudoinverse
I get this error
test_matrix_pseudoinverse.cpp:26:64: fatal error:
opencv2.4/modules/core/include/opencv2/core/core.hpp: No such file or
directory #include
^ compilation terminated.
The source code with all the libraries are in github
https://github.com/shiblybcc/linear-algebra-benchmark
I have downloaded the code from here. It would be nice if someone could tell me why I am getting this error and how to run the code without any error.
I am on linux and I have added opencv2 folder in /usr/local/include directory.
I guess this is resulted from not setting the include path if the file complained by the compiler does exist. Suppose your OpenCV source code tree is under /home/yourhome (i.e the full path to the file reported not existed should be /home/yourhome/opencv2.4/modules/core/include/opencv2/core/core.hpp), you need to specify the include path by -I/home/yourhome argument. Therefore the full command line to build should be as:
g++ -I/home/yourhome test_matrix_pseudoinverse.cpp -o test_matrix_pseudoinverse

GCC compiler cannot find hpp files

I am trying to install the hep-mc library listed here: https://github.com/cschwan/hep-mc for use on compute using the instructions listed in the documentation here: https://github.com/cschwan/hep-mc#installation . To compile one of the example files, I typed this into the terminal:
g++ -L/usr/local/hep-mc/include vegas_mpi_ex.cpp -o vegas_mpi
but I get these error messages:
mpi_vegas_ex.cpp:1:22: error: hep/mc.hpp: No such file or directory
mpi_vegas_ex.cpp:2:26: error: hep/mc-mpi.hpp: No such file or directory
mpi_vegas_ex.cpp:8:17: error: mpi.h: No such file or directory
in the beginning of my code, the declarations are like this:
#include "hep/mc.hpp"
#include "hep/mc-mpi.hpp"
#include <mpi.h>
The tutorial states that I should point the compiler to the location of the "include" folder that contains all the .hpp files, which I have done. Do you guys have any idea as to what I'm doing wrong?
It should also be noted that the compiler cannot find the mpi.h directory even though I have loaded the openmpi module.
-L sets paths where the linker searches for libraries to link. The option you're looking for is -I, which sets the paths where the compiler searches for #included files.
g++ -L/usr/local/hep-mc/include vegas_mpi_ex.cpp -o vegas_mpi
Oops!
g++ -I/usr/local/hep-mc/include vegas_mpi_ex.cpp -o vegas_mpi
-L specifies the path to library files; -I specifies the path to includes.
This is confusing because in terms of project management and distribution, we consider "the library" to include both binaries and header files, as well as documentation and all sorts of goodies. But at a technical level that is not what "library" means.

How to install and use NTL in cygwin

The libraries that I've used so far require installation. So they generate xx.a file that can be included in the code in cygwin. However, NTL library for windows only requires to unzip the file. So I need to know how to use it in cygwin command line. I have done #include in the code. The problem is in include directory in NTL all files are " .h".
What I have done is:
g++ -c Polynomial.cpp -L/cygdrive/c/cygwin/home/Win7/libpaillier -
l:libpaillier.a -L/cygdrive/c/cygwin/home/Win7/Cryptopp -l:libcryptopp.a -
L/cygdrive/c/cygwin/home/Win7/WinNTL-9_2_0/include/NTL -lgmpxx -lgmp
but I get below error:
fatal error: NTL/ZZ.h: No such file or directory
#include <NTL/ZZ.h>
^
compilation terminated.
It'd be great if someone give me a clue. TBC: I have already installed GMP and been using it.
In gcc path to headers location is specified with -I switch. With -L you define paths to compiled libraries location (directories with .a or .so files).
Also if full path to zz.h is /cygdrive/c/cygwin/home/Win7/WinNTL-9_2_0/include/NTL/zz.h then NTL should not be included in path specified in gcc arguments.
So, you need at least to replace
-L/cygdrive/c/cygwin/home/Win7/WinNTL-9_2_0/include/NTL
with
-I/cygdrive/c/cygwin/home/Win7/WinNTL-9_2_0/include
and maybe for others libraries as well and add paths to compiled libraries locations with -L where they are needed.

cuda header inclusion fails

I want to build a cuda plugin for an other project written in C++ using MPI.
I got the following situation:
startingpoint.cpp is a c++ file including the cudaintegrator.h and
includes datastructure.h
cudaintegrator.h is the header file for a
cuda file including datastructure.h
cudaintegrator.cpp is the
implemenation of cudaintegrator.h
datastructure.h is a header file
specifing some datastructures
the files are organized like that:
/trunk/
/src
/folder1
/folder2
/startingpoint.cpp
/folder3
/cudaintegrator.h
/cudaintegrator.cpp
/folder4
/folder5
/datastructure.h
When I run nvcc from my trunk dir with the following command:
/usr/local/cuda/bin/nvcc -c -o src/folder1/folder3/cudaintegrator.o src/folder1/folder3/cudaintegrator.cu
the included file `#include "folder4/folder5/datastructure.h" is not found:
src/folder1/folder2/cudaintegrator.h:12:33: fatal error: folder4/folder5/datastructure.h: No such file or directory
When I run mpic++ for the compilation of startingpoint.cpp, which uses the same include, the datastructure.h is found.
I suspect that the working directory of nvcc and mpic++ are somehow different(?) even both are run from the trunk directory.
When I change the include to ../../folder4/folder5/datastructure.h the file itself is found, but subsequent includes fail for the same reason. I can not change the includes in all subsequent files because they can't be found by mpic++ in this case.
Does anyone have a suggestion how I should include the files in this situation correctly, or how to instruct nvcc to find the included files?
Providing include paths (-I) to the nvcc invocation should be enough (if not, it uses relative include paths only, that's why adding ../.. works for a single include).