I want to use C++ Code in Java. I know I have to use JNI. And now I want to compile a shared library in C++ on Linux. I using the Code::Blocks 16.01 IDE and the GNU GCC Compiler.
And now I want to compile this very simple code:
#include <iostream>
void sayHello ()
{
std::cout << "Hello from C++" << std::endl;
}
(I know that I also have to include some more to use this library later in java, but this was just my first test, if it compiles)
The Build log is:
g++ -shared obj/Debug/main.o -o bin/Debug/libnativetest.so
/usr/bin/ld: obj/Debug/main.o: Die Umlagerung von
obj/Debug/main.o: error adding symbols: Ungültiger Wert
collect2: error: ld returned 1 exit status
Process terminated with status 1 (0 minute(s), 0 second(s))
1 error(s), 0 warning(s) (0 minute(s), 0 second(s))
The Build messages:
||error: ld returned 1 exit status|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
When I just compile the method without#include <iostream> (and sure without cout) it works.
I have tested with another header file like #include <string> and this works.
When I create a project not as a shared library instead a Console Application I can use <iostream>.
I am new to C++ and Code::Blocks therefore if you need some more info please help me where I can find this information.
I do not use Code blocks, so I have no idea how it decided to leave out the fPIC flag. If you try to build it on the command line with
g++ main.cpp -o main.o
The gcc (v5.4 in my case) prompts you to add -fPIC flag, with with the error disappears and the compilation succeeds. fPIC stands for position independent code. i.e., the function addresses (jump addresses) are not hard coded but are left blank. The loader, when it needs the .so, loads it to the memory and then fills the jump addresses dynamically. (-fpic could also work, it is for short jumps, whereas fPIC accommodates also long jumps, i.e., bigger jump ranges at the cost of binary size.)
Related
I'm learning opengl and wanted to use Codeblocks IDE because visual studio seems too laggy and slow. After starting a console application project i've tried to link GLFW3 library to make this code run:
#include <GLFW/glfw3.h>
#include <thread>
int main()
{
glfwInit();
std::this_thread::sleep_for(std::chrono::seconds(1));
glfwTerminate();
}
I use GNU GCC 32-bit Compiler from MinGW(one that comes with codeblocks installation). I'm pretty certain that i've done everything correctly, i've read through like every article that i was able to find explaining how to setup codeblocks for opengl. I've linked libglfw3.a and libglfw3dll.a and set up correct search directories for compiler and linker but i always get this undefined reference error no matter what:
-------------- Build: Debug in glfw_again_test (compiler: GNU GCC Compiler)---------------
g++.exe -L"C:\Program Files\CodeBlocks\MinGW\lib" -o bin\Debug\glfw_again_test.exe obj\Debug\main.o "C:\Program Files\CodeBlocks\MinGW\lib\libglfw3.a" "C:\Program Files\CodeBlocks\MinGW\lib\libglfw3dll.a" "C:\Program Files\CodeBlocks\MinGW\x86_64-w64-mingw32\lib\libopengl32.a"
obj\Debug\main.o: In function `main':
C:/dev/OpenGL/CodeBlocks/glfw_again_test/main.cpp:6: undefined reference to `glfwInit'
C:/dev/OpenGL/CodeBlocks/glfw_again_test/main.cpp:8: undefined reference to `glfwTerminate'
collect2.exe: error: ld returned 1 exit status
Process terminated with status 1 (0 minute(s), 1 second(s))
3 error(s), 0 warning(s) (0 minute(s), 1 second(s))
I have no idea what else i could try to fix this problem.
Apparently i was mistaken and thought that i use 32-bit MinGW compiler but seems like i accidentally installed 64-bit one with codeblocks. After switching to mingw gcc 32-bit compiler and rebuilding(simple build will lead to an error) my project i finally got it to work(not exactly this code snippet but another sample one).
On the How-To initialize libosip2 site theres program to initialize osip libraries
https://www.gnu.org/software/osip/doc/html/group__howto0__initialize.html
#include <winsock2.h>
#include <Time.h>
#include <stdio.h>
#include <stdlib.h>
#include <osip2/osip.h>
#include <osipparser2/osip_parser.h>
#include <string.h>
int main()
{
int i;
osip_t *osip;
i=osip_init(&osip);
if (i!=0)
return -1;
}
I'm trying to run this code but it doesnt work,
library version 5.0.0
error:
||=== Build: Debug in cos2 (compiler: GNU GCC Compiler) ===|
obj\Debug\main.o||In function `main':|
C:\Users\emergency\Documents\analizer\cos2\main.cpp|14|undefined reference to `osip_init'|
||error: ld returned 1 exit status|
||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
In order to link with a library, you need to specify it on the command line.
Note that libosip2 produces two libraries and you have to link with both of them in order to use both parser (libosipparser2) and the sip engine (libosip2).
The exact command line depends on the platform, compiler you use and may also differ if you are linking to a static library or dynamic library.
With GCC and dynamic linking, it should be that way:
-L/install-directory-for-libosip2-libs/ -losipparser2 -losip2
-L/install-directory-for-libosip2-libs/ parameter refers to the directory where libraries are available.
this is because you did not link the binary osip.o
I get a bizzare error after upgrading to MinGW 5.3.0-2(actual version)
I checked everything because It's the 5th time i reinstall it and thought it would help
Code::Blocks outputs this:
mingw32-g++.exe -Wall -fexceptions -g -c C:\Users\Tudor\Documents\C++\test\main.cpp -o obj\Debug\main.o
mingw32-g++.exe -o bin\Debug\test.exe obj\Debug\main.o
c:/mingw/bin/../lib/gcc/mingw32/5.3.0/../../../../mingw32/bin/ld.exe: cannot find -lpthread
collect2.exe: error: ld returned 1 exit status
Process terminated with status 1 (0 minute(s), 0 second(s))
2 error(s), 0 warning(s) (0 minute(s), 0 second(s))
Note: if I check the -std=c++11 OR -std=c++14 flags i get output like here: Click me
Is it a problem with the last version of MinGW? If so where can I get the last working version? Or is anything in my computer messed up? I would like to keep this version if its possible to fix it but its getting me crazy
You haven't installed the Posix Threads (pthread) library, so the linker
can't find it. The particular Windows GCC packager that you have chosen doesn't
install it by default.
Start the MinGW Installation Manager and navigate All Packages -> MinGW
-> MinGW Standard Libraries. In the Standard Libraries presented, select
mingw32-pthreads-w32 dev. Then from the menubar select Installation -> Apply Changes
and proceed. Make it look like
Newer Windows GCC packagers, e.g. mingw-w64
or TDM-GCC, will install pthreads by default and
provide 64- as well as 32-bit compilers. mingw-w64 in addition offers more up-to-date
versions of GCC (currently 6.2, which is the latest GCC release).
If you use codeblocks-16.01-nosetup version or the earlier similar version then you need to install MinGW in home directory of C drive (C:\MinGW) and you have to add "C:\MinGW\bin" in the system variable called "Path".
However, I would recommend to use "codeblocks-16.01mingw-setup.exe" version of codeblocks. This has a preloaded MinGW latest version. you can get it from here: https://sourceforge.net/projects/codeblocks/files/Binaries/16.01/Windows/codeblocks-16.01mingw-setup.exe/download
I have just setup SDL on CodeBlocks, and I am getting a build error:
-------------- Build: Debug in SDL learning (compiler: GNU GCC Compiler)---------------
mingw32-g++.exe -L..\deps\lib -o "bin\Debug\SDL learning.exe" obj\Debug\main.o -lmingw32 -lSDL2main -lSDL2
obj\Debug\main.o: In function `SDL_main':
C:/Users/73638G75MA/Documents/prive/programeren/C++ projects/SDL learning/main.cpp:7: undefined reference to `SDL_Init'
c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../libmingw32.a(main.o):(.text.startup+0xa7): undefined reference to `WinMain#16'
collect2.exe: error: ld returned 1 exit status
Process terminated with status 1 (0 minute(s), 0 second(s))
2 error(s), 0 warning(s) (0 minute(s), 0 second(s))
The build log doesn't really tell me anything, maybe some of you guys know a solution.
In case you need my code:
#include <iostream>
#include <SDL.h>
using namespace std;
int main(int argc, char *argv[]){
if(SDL_Init(SDL_INIT_EVERYTHING)!=0){
cout << "Could not initiate SDL" << endl;
}
return 0;
}
I got my include and lib files in folder named deps.
Also, it does recognize the SDL.h file and its commands, because when I type #include <S it suggests SDL.h. It also autocompletes the SDL commands.
I am trying to execute give fortran code in Code::Blocks on Windows 8
program main
write (*,*) "hi"
stop
end
The error I am getting is
G:\Study\Programs\bairstow.o:bairstow.f undefined reference to `_gfortran_st_write'
G:\Study\Programs\bairstow.o:bairstow.f undefined reference to `_gfortran_transfer_character_write'
G:\Study\Programs\bairstow.o:bairstow.f undefined reference to `_gfortran_st_write_done'
G:\Study\Programs\bairstow.o:bairstow.f undefined reference to `_gfortran_stop_string'
G:\Study\Programs\bairstow.o:bairstow.f undefined reference to `_gfortran_set_args'
G:\Study\Programs\bairstow.o:bairstow.f undefined reference to `_gfortran_set_options'
=== Build failed: 6 error(s), 0 warning(s) (0 minute(s), 1 second(s)) ===
I copy pasted the .f file in the folder of the compiler itself and executed the command
gfortran.exe hello.f
The output .exe file is successfully generated and executed.
I am not sure if I have setup the compiler properly in C::B. What I might be missing?
UPDATE :
As suggested by janneb, I added the linker library path so as to use libgfortran-3.dll.
The file gets compiled successfully with the following build log :
mingw32-g++.exe -c G:\Study\Programs\bairstow.f -o G:\Study\Programs\bairstow.o
mingw32-g++.exe -o G:\Study\Programs\bairstow.exe G:\Study\Programs\bairstow.o "C:\Program Files (x86)\CodeBlocks\MinGW\bin\libgfortran-3.dll"
Process terminated with status 0 (0 minute(s), 1 second(s))
0 error(s), 0 warning(s) (0 minute(s), 1 second(s))
When I execute the file, after waiting for about 2 minutes, I get the following error:
Have I made any mistake in linking the library file?
Hint : It has messed up with my GNU C Compiler also. Now even after unlinking the libgfortran-3.dll, I can't execute a simple helloWorld.c program.
Open C::B IDE and Go to "Settings" and Select "GNU Fortran Compiler" From Selected Compiler and Clik the button "Set as default" and finally click "Ok"
Based on the error message you're not linking the GFortran runtime library (libgfortran) when compiling via C::B. The gfortran.exe driver program automatically handles this, so most likely you're compiling with gcc.exe, which based on the file extension can invoke the Fortran compiler (f951), but doesn't do the linking stuff that gfortran.exe does.
Anyway, I have never used C::B nor gfortran on Windows, but hopefully the above explanation gives you a hint where to start looking.
In my case I had to do an additional step. Go to Project->Build options-> select the GNU Fortran Compiler as well.