OpenCV C++ Linux g++ compiling - c++

I just installed OpenCV-3.4.1 on Ubuntu 18.04. I am able to compile my C++ files only when I run the g++ command with pkg-config --cflags --libs opencv
Is it possible for me to compile the c++ file without using these additional flags
How can I tell g++ to automatically look at /usr/include/opencv for the .h files everytime

For adding to the include path see this question: How to add a default include path for GCC in Linux?
A better solution however is to write a shell script to compile your code rather than having to type in the command line every time.
The best solution is to use a proper build system which will save you a lot of pain in the future, just a few of the many available options:
GNU make
cmake
google gyp
google gn
ninja

Related

how compile opus-codel with g++

Hello I've got my first program using opus-codec library and I wonder if there is another way to compile it without passing by cmake. Such as the g++ command for example. Which flags should I use ?
cmake is not a compiler, it is a tool for managing the build process. To compile your files, you are already using a compiler (g++ may be) which is called by the build files created by cmake.
For example when you run cmake command on a linux, you will generate a Makefile. The when you run your make command it will call gcc or g++. To see the compilation commands, you can add VERBOSE=1 to your make command.

How to link GLEW and GLFW and OpenGL to MingW's g++

I am doing a course on OpenGL.
So I have run my project in Visual Studio 2019 and it works.
What I needed to do in Visual Studio was:
Add GLEW's and GLFW's additional include directories. (when you download the libraries it is simply the location of the include file)
Add GLEW's and GLFW's additional library directories. (lib folder locations)
Add the additional dependencies. (opengl32.lib, glew32.lib, glfw3.lib)
Copy and paste GLEW.dll into the project files, next to main.cpp.
And I run my code and it works.
But I don't want to use Visual Studio 2019, I would much rather work in Notepad++ or VSCode, what I really want is to just make a project out of pure notepad and compile it with the new Windows Terminal.
My question:
How can I do all of the things I did in visual studio 2019 from Power Shell?
I heard that MingW comes with its own power shell or command prompt, I imagine I need to find it and give it some commands to link everything up before I start coding.
Where do I find MingW's power shell equivalent and what commands do I need to type?
I have been stuck on this for ages now and could not find any information about it online. (except for what -L and -l does, but these are not power shell commands)
The MingGW and mingw-w64
compilers are Windows commandline tools. They are Windows ports of (some of)
the GCC compilers. tdm-gcc is yet another choice.
Commandine tools for any operating
system don't need their own shell. You can run them in any shell you've got
on that operating system. On Windows today
you have a choice of at least PowerShell and the old CMD shell.
The MinGW project provides, as well as its GCC toolchain, a minimal unix-like
environment for Windows called MSYS, which includes a shell. You don't need
MSYS to run the compiler.
As long as the GCC tools can be located in
the value of the PATH environment variable that is operative in
the shell at compiletime, then you run the compiler at the shell prompt:
>gcc [options...]
>g++ [options...]
the same way it is run on any operating system. If you want to work with a GCC toolchain then the question:
How can I do all of the things I did in visual studio 2019 from Power Shell?
is simply the question, How do you run GCC? That's a question of
sweeping generality. You need to study relevant books
and documentation
Very sketchily, if you want to compile and link a C++ program that has source files main.cpp and other.cpp and depends on libraries
foo and bar that have their C++ APIs defined in header files and are implemented in DLLs,
you will do it with commands of the following form:
To compile the source files to object files:
>g++ -c -o main.obj main.cpp -I/path/to/foo/header/files -I/path/to/bar/header/files [any other compilation options....]
>g++ -c -o other.obj other.cpp -I/path/to/foo/header/files -I/path/to/bar/header/files [any other compilation options....]
To link the object files and libraries to make an excutable program:
>g++ -o prog main.obj other.obj -L/path/to/foo_dll -L/maybe/a/different/path/to/bar_dll -lfoo -lbar [any other linkage options...]
And if all that is successful then the program will be prog.exe and you can run it:
>prog
just like you ran g++, provided that foo.dll and bar.dll can be found at runtime by the OS loader's DLL search protocol
As I think you appreciate, in real life nobody builds programs by typing the all the
commands in a shell except for instructional purposes. They use a build system or an IDE to automate it. But it is true that building programs though the medium of a build system or IDE presents fewer difficulties if you do it with a basic grasp of how the tools behind it work.

Switching gcc version on remote Linux based HPC (no root rights)

There is a specific program i need to run using c++11 libraries offered by gcc-4.8 and higher. The remote HPC on which i am trying to run the program has gcc-4.6.1. I was able to install the gcc-4.8.2 version on the HPC in a user specified directory, say
/share/user/gccInstall
(gccInstall has the /bin and /lib (etc) folders you get after installation)
I need to switch to this version for compiling my program. I tried using update-alternatives --config gcc, but it does not return anything.
Can anyone help me solve this!
EDIT:
Was able to change the gcc version using the following commands:
setenv PATH /share/user/gccInstall/bin
setenv LD_LIBRARY_PATH /share/user/gccInstall/lib
Now gcc --version returns 4.8.2.
But encountered another error while compiling:
g++: error trying to exec 'as': execvp: No such file or directory
what am i missing?
Many Thanks.
If you have a different version of g++ that you want to use then make sure you're getting the right one according to your $PATH or else specify the full path to the g++ you want. The other thing to be aware of is that you will probably need to update the $LD_LIBRARY_PATH environment variable to get the necessary libraries from your new gcc installation.
What exactly is the problem you're having? Can you compile but not run? Does compilation fail? Do you have any error messages you can share?
Assuming as you say that your new GCC installation is
under /share/user/gccInstall then if you add the option
-B/share/user/gccInstall
to each invocation of g++ or gcc then it will have this
effect:
-Bprefix
This option specifies where to find the executables, libraries, include files, and data files of the compiler itself.
(from Options for Directory Search)
This should help, and will perhaps be enough.

How to compile Clang on Windows

I have been trying to find a way to get Clang working on Windows but am having trouble. I get Clang to compile successfully, but when I try to compile a program I have a bunch of errors in the standard headers.
I am aware of rubenvb's excellent prebuilt versions of clang, but I want to compile it for myself. I also was listening to the GoingNative talks about clang which said that it didn't have very good Windows support yet. How can I get clang working on Windows?
I used the following method to compile clang for C++ on Windows 7 and it has been validated by Mysticial and others:
Download and install MinGW (make sure you install the C++ compiler) and put the bin folder in your PATH (I have MinGW 4.6.1 and tested successfully on another computer with 4.6.2)
Make sure you have Python in your PATH (not 3, I have 2.7)
(Optional: Make sure you have Perl in your PATH (I used ActivePerl 5.14.2 64-bit))
Get CMake and put it in your PATH
Go to the LLVM downloads page and download the LLVM 3.0 source code along with the Clang source code. Don't get the code from the SVN, it doesn't work with the MinGW headers.
Extract the source codes; I had the llvm source in a folder named llvm-3.0.src on my desktop
Put the clang source directly in a folder called "clang" (it must be called this exactly or you will build llvm but clang won't get built) in the "tools" folder inside the llvm source folder, this should make your directories look like:
llvm source
autoconf folder
...
tools folder
...
clang folder
bindings folder
...
Makefile file
...
...
...
Make a folder named "build" in the same directory as the llvm source folder
Open a command line and cd into the build folder
Run the command cmake -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release ..\llvm-3.0.src
(the last argument is the relative path to the folder that has the llvm source in it (and the clang source in the tools/clang subdirectory))
This will do the equivalent of a "configure" command, and the makefiles and everything will be generated in the build folder
This will take a few minutes
Run the command mingw32-make
This will compile llvm and clang, and the clang executables will be generated in the build/bin folder
This will probably take a long time. (You can try to speed it up by adding parallel builds, -j<number> option) It might be good to close all other programs so that your computer can concentrate, and so they don't interfere with the lengthy compilation process, such as putting a lock on a folder that the compiler is writing to (it happened to me). I even turned off my antivirus and firewall software so that they wouldn't try to scan the generated files and get in the way.
Time for testing it out
Create a .cpp file in the build/bin folder (I will use hello.cpp). Use a standard library header to make sure the include paths and libraries are working. Start with a very simple program.
(What I started with:
#include <iostream>
int main() {
std::cout << "hi";
}
)
Run the command clang hello.cpp -std=c++0x -I"C:\MinGW\lib\gcc\mingw32\4.6.1\include\c++" -I"C:\MinGW\lib\gcc\mingw32\4.6.1\include\c++\mingw32" -Lc:/mingw/bin/../lib/gcc/mingw32/4.6.1 -Lc:/mingw/bin/../lib/gcc -Lc:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../../mingw32/lib -Lc:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../.. -L/mingw/lib -lstdc++ -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt
(-L specifies a directory in which to search for libraries and -l specifies a library to link)
(If you do not have MinGW installed to the same path as I did, you can find out the paths with the command "g++ somefile.cpp -v" to get g++ to spill its guts about what options it is using for the library paths and library files and everything else
Search near the end of the output for the -L and -l options. Be aware of the .o file names that are interspersed with the -L's. Clang uses many of the same options as g++ so I literally copied and pasted that line from the output of g++)
This should compile your program and produce a file named a.out
rename a.out to a.exe or whatever
Run the .exe
Your program should run.
Clang (3.0) still has some problems on Windows (I don't know if these problems are also on linux). For example, compiling a lambda (which clang doesn't support) with -std=c++0x will cause clang to crash and emit a diagnostic error.
(I was informed on the LLVM IRC that this is because clang implements parsing for lambdas but not semantic analysis, which is the phase in which it crashes (because they forgot to disable parsing lambdas for the 3.0 release), and they already know about this bug)
Also, the illustrious Mysticial kindly agreed to test this guide and made some observations during his testing:
Windows headers seem to work.
Currently only works for 32-bit.
64-bit compiles fine, but won't assemble.
SSE probably is fine. ([Mysticial hasn't] tested a working SSE on 32-bit though.)
Here is what worked in my environment, on Windows 8.1, overall similar to Seth's instruction, but with fresher tools.
I installed MinGW 64 into C:/MinGW, to be precise I've used STL's distro.
I installed Python 3, just took their latest version.
I installed CMake 3.0.2
I forked LLVM and Clang on Github and cloned them to my machine, placing Clang's repo into llvm\tools\clang folder (the structure is described on the official page, they just show examples with svn instead of git).
I created "build" folder next to "llvm" folder, and inside the "build" folder ran this command: cmake -G "MinGW Makefiles" -D"CMAKE_MAKE_PROGRAM:FILEPATH=C:/MinGW/bin/make.exe" -DCMAKE_BUILD_TYPE=Release ..\llvm (for some reason CMake couldn't find the "make" automatically)
Then I ran "make" to actually build. The build took a couple of hours.
After that in another folder I've created 1.cpp, which executes a lambda expression to print "hi":
#include <iostream>
int main() {
[]{ std::cout << "hi"; }();
}
I've also created a cmd file to compile the cpp. Alternatively you can just set the PATH variable properly via other means. Note that GCC vesrion in your MinGW package may be different. Also Clang has some builtin paths it tries, but they are tied to specific GCC versions, and mine was not among them, so I had to provide the include paths explicitly.
set PATH=<path to the build folder from step 5>/bin;c:/mingw/bin;%PATH%
clang++ -std=c++11 1.cpp -o 1.exe -I"C:/MinGW/include"
-I"C:/MinGW/include/c++/4.9.1" -I"C:\MinGW\include\c++\4.9.1\x86_64-w64-mingw32" -I"C:\MinGW\x86_64-w64-mingw32\include"
Running that cmd compiled 1.cpp into 1.exe that printed "hi".
What did not work:
I've tried building the same llvm+clang sources without MinGW+GCC using the MSVC compiler from VS 2015 CTP. It built Clang successfully, the only difference is that you need to do that from the Developer CMD window, and you'd need to run cmake -G "Visual Studio 12" ..\llvm and then compile the solution in Visual Studio. However, that Clang failed to compile a sample cpp, it complained about "undeclared identifier 'char16_t'" and "__int128 is not supported on this target" within the MinGW standard library headers. If I use clang-cl and MS STL headers it complains about "throw x(y)" specifiers . Maybe I needed to provide some extra keys to the build, but I couldn't get it to work.
C:\Program Files (x86)\Microsoft Visual Studio
14.0\VC\include\xiosbase(293,4) : error: cannot compile this throw expression yet _THROW_NCEE(failure, "ios_base::eofbit set");
C:\Program Files (x86)\Microsoft Visual Studio
14.0\VC\include\xstddef(56,30) : note: expanded from macro '_THROW_NCEE' #define _THROW_NCEE(x, y) throw x(y)
Refer http://clang.llvm.org/get_started.html#buildWindows
I've used "Visual Studio 11 Win64" with cmake and its worked with the currently available VS Express for Desktop.
Also for lib I'm using MinGW-W 64 and for missing files SUA. http://mingw-w64.sourceforge.net/ and http://www.suacommunity.com/
For linking .o compiled by clang++ for use with the W 64 binaries, I use -m i386pep with ld linker again shipped within the W 64 deliverable.
I had numerous problems building LLVM and clang using VS and being a Unix user I prefer building sources from the command line.
Following the instructions from Seth Carnegie I built it from the SVN repository as opposed to the supplied packages, using LLVM v3.3 with MinGW v4.5.2.
clang on Windows is NOT stand-alone, and it needs to be combined with another compiler (like MingW or MSVC).
The steps to do said combination are rather complicated, at least if you don't want to miss anything, hence the "build script" is worth an entire project:
https://github.com/mstorsjo/llvm-mingw
I have tested llvm-mingw project's version 20220906 (at time of writting, latest version), and it combines clang 15.0.0 with MingW seamlessly.
See pre-built binary releases:
https://github.com/mstorsjo/llvm-mingw/releases
Or try what worked for me:
https://github.com/mstorsjo/llvm-mingw/releases/download/20220906/llvm-mingw-20220906-msvcrt-i686.zip

How do I add sqlite3 to my project

How do I statically link the sqlite3 libary to my C++ program?
I am using the G++ compiler.
in Unix/Linux you'll have to make sure the library (e.g. libsqlite3.a) is in your LD_LIBRARY_PATH and then you add "-lsqlite3 -static" to the g++ option.
Assuming you're on Linux and using the GNU ld linker:
g++ <your-code> -Wl,--Bstatic -lsqlite3
Of course, if libsqlite3.a isn't in your library path, you have to pass the directory it's in to the compiler as an additional -L flag.
If you don't have a static version (I don't on my system), you either have to check if you can get one or if you'll have to build your own.
On a Linux system I recommend using pkg-config.
Running pkg-config --cflags --libs --static sqlite3 should give you the compiler and linker flags you need.
Go to www.sqlite.org and download the latest version's amalgamation tarball. Include their source files to your project (make file, whatever) and forget about it. It's embedded anyway, they compile in a jiffy, if you put into your version control repo, you know what version you're using in what version of your application and you can forget about linking options. Just remember that their source files are C and not C++.