Multi threading in borland - multithreading

I'm programming c++ in Borland c++ 5.02. I'm trying to run this code:
#include <stdio.h>
#include <pthread.h>
#define NUM 5
main()
{
pthread_t t1, t2; /* two threads */
void *print_msg(void *);
pthread_create(&t1, NULL, print_msg, (void *)"hello");
pthread_create(&t2, NULL, print_msg, (void *)"world\n");
pthread_join(t1, NULL);
pthread_join(t2, NULL);
}
But I get this error:
Info :Compiling C:\BC5\BIN\noname00.cpp
Error: noname00.cpp(2,2):Unable to open include file 'PTHREAD.H'
Error: noname00.cpp(8,15):Undefined symbol 'pthread_t'
Error: noname00.cpp(8,15):Statement missing ;
Error: noname00.cpp(12,18):Call to undefined function 'pthread_create'
I highlighted the main error which is caused by 'PTHREAD.H'. I checked the include folder for this file. It doesn't exist. How can I fix this problem?

Borland's C++ toolchain doesn't include a pthreads library, nor does the Windows SDK. You'll either need to use native Win32 thread APIs or get a 3rd party pthreads implementation for Windows.
Some options include:
winpthreads.h: http://locklessinc.com/articles/pthreads_on_windows/
pthreads-win32: https://www.sourceware.org/pthreads-win32/
I have no idea how well those things work with Borland C++ 5.x.
Another alternative is to use a toolchain that includes a pthreads implementation, such as TDM's MinGW toolchain:
http://tdm-gcc.tdragon.net/

your problem is #include <pthread.h>
you need either copy all the pthread related files (.h,.c,.cpp,.hpp,.lib,.obj)
into compiler include folder
or add include path to it in your project/compiler settings
or copy it locally to your project and change #include <pthread.h> to #include "pthread.h"
So compiler did not find the pthread.h header
so no datatype from it is known from compiler side (like pthread_t)
therefore the rest of the errors...

Related

unresolved external symbol _IID_IDXGIAdapter4

It is really weird....
I think this symbol _IID_IDXGIAdapter4 in dxguid.lib, but when I use DUMPBIN command to check the symbols inside the dll. There are _IID_IDXGIAdapter1~3, no _IID_IDXGIAdapter4.
Windows SDK : 10.0.18362.0
And most weird is I found a DX12 tutorial that using IDXGIAdapter4 and I can compile it successfully, but my project can't, even I copy his project setting.
https://github.com/jpvanoosten/LearningDirectX12/blob/v0.0.1/Tutorial1/src/main.cpp
In this project, he only use d3d12.lib ,dxgi.lib ,dxguid.lib, and I already put them into project setting.
This was an oversight and is fixed in the next Windows 10 SDK after the current one (i.e. 19041 still has the bug).
DXGUID.LIB was missing:
IID_IDXGIAdapter4
IID_IDXGIOutput6
IID_IDXGIFactory6
IID_IDXGIFactory7
It was reported on GitHub as well.
There's nothing special about dxguid.lib. It's just code like this:
#define INITGUID
#include <Windows.h>
#include <d3dcommon.h>
#include <dxgi1_5.h>
#include <dxgidebug.h>
#include <d3d11_4.h>
#include <d3d11shader.h>
#include <d3d11sdklayers.h>
#include <d3dcompiler.h>
#include <d3d12.h>
#include <d3d12video.h>
#include <d3d12shader.h>
#include <d3d12sdklayers.h>
The bug was using dxgi1_5.h in the dxguid library source, but I updated it to use dxgi1_6.h.
Note that most of the "COM" GUIDs such as for Windows Imaging Component (WIC) are in uuid.lib.
UPDATE: This bug in dxguid.lib is fixed in Windows 10 SDK (20348), version 2104.
pDxgiAdapter1->QueryInterface(IID_IDXGIAdapter4, (LPVOID *)p_ppDxgiAdapter4);
change to
pDxgiAdapter1->QueryInterface(__uuidof(IDXGIAdapter4), (LPVOID *)p_ppDxgiAdapter4);
solve my problem
but in dxgi1_6.h
DEFINE_GUID(IID_IDXGIAdapter4,0x3c8d99d1,0x4fbf,0x4181,0xa8,0x2c,0xaf,0x66,0xbf,0x7b,0xd2,0x4e);
I still can't use IID_IDXGIAdapter4.

'[WXWIN root]/lib/vc_lib/mswd/wx/setup.h': No such file or directory

I have installed WxWidgets 3.1.1, added the WXWIN environment variables, and used Build All with the wx_vc15.sln file. While trying to compile the following code:
#include <iostream>
#include <cstdlib>
#include <array>
#include <iomanip>
#include <ctime>
#include <wx/wx.h>
using std::cin;
using std::cout;
using std::endl;
int main()
{
}
I am hit with this error:
Error C1083 Cannot open include file: '../../../lib/vc_lib/mswd/wx/setup.h': No such file or directory
I go into [WXWIN root]\lib\vc_lib, there are only mswu and mswud there. How come the error complains about something inside mswd which doesnt exist? Could someone please help me? Thank you.
You need to define UNICODE and/or _UNICODE in your project settings (which is normally the default for the new projects).
This is mentioned in the instructions for setting up your project.

Undefine references of functions from CUDA

I am looking for a way to use cufft.h a CUDA toolkit which perform GPU parallelization of fast fourier transform.
First of all, I downloaded cuda library and cufft through synaptic.
Then I used the sample program from the cufft documentation from NVidia.
my cuda library is located at /usr/local/cuda-9.0 on my laptop.
I added those include :
1 #include <iostream>
2 #include <cstdio>
3 #include "/usr/local/cuda-9.0/include/cuda.h"
4 #include "/usr/local/cuda-9.0/include/cuda_runtime_api.h"
5 #include "/usr/local/cuda-9.0/include/cufft.h"
I compile like this :
g++ -Wall main.cpp -o main
and get undefine references error for each cuda-like functions (cudaMalloc,cudaGetLastError, etc...)
I am pretty young about library implementation and I don't understand what should I do to include properly this cuda-cufft library...
The nvidia documentation talk about filename.cu but I don't know what this is about...
Thank you for your time :)
n.b : I added cuda.h and cuda_runtime_api.h after reading a forum (I forgot which it was). Apparently, only cuda_runtime_api.h is necessary (I tried without cuda.h and get the same errors).
Here is a complete sample code (that doesn't do anything useful) and a sample g++ compile command that will properly compile and link the code:
$ cat t1338.cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <cuda_runtime.h>
#include <cufft.h>
int main() {
size_t work_size;
int fft_sz = 32; // Size of each FFT
int num_ffts = 1; // How many FFTs to do
cufftComplex *in_buf_h, *in_buf_d, *out_buf_d;
// Allocate buffers on host and device
in_buf_h = new cufftComplex[fft_sz*num_ffts];
cudaMalloc(&in_buf_d, fft_sz*num_ffts*sizeof(cufftComplex));
cudaMalloc(&out_buf_d, fft_sz*num_ffts*sizeof(cufftComplex));
cudaMemset(out_buf_d, 0, fft_sz*num_ffts*sizeof(cufftComplex));
// Fill input buffer with zeros and copy to device
memset(in_buf_h, 0, fft_sz*num_ffts*sizeof(cufftComplex));
cudaMemcpy(in_buf_d, in_buf_h, fft_sz*num_ffts*sizeof(cufftComplex), cudaMemcpyHostToDevice);
// Plan num_ffts of size fft_sz
cufftHandle plan;
cufftCreate(&plan);
cufftMakePlan1d(plan, fft_sz, CUFFT_C2C, num_ffts, &work_size);
// Execute the plan. We don't actually care about values.
cufftExecC2C(plan, in_buf_d, out_buf_d, CUFFT_FORWARD);
// Sync the device to flush the output
cudaDeviceSynchronize();
return 0;
}
$ g++ t1338.cpp -I/usr/local/cuda/include -L/usr/local/cuda/lib64 -lcudart -lcufft
$
Your include statements are probably OK as-is, but I have used a format that says "search on the standard path for this file" and then I identify an addition to the standard path with
-I/usr/local/cuda/include
However your compile command is definitely missing the necessary link apparatus. You need to specify where to find the libraries (the path) with -L and then indicate the specific libraries to include, which are both the CUDA runtime library (-lcudart) and also the CUFFT library (-lcufft):
-L/usr/local/cuda/lib64 -lcudart -lcufft
The CUDA toolkit normally gets installed with sample codes which will have sample Makefiles you can inspect, or just compile those projects to see typical compilation command usage.
As I mentioned, this source code is incomplete. It doesn't do anything useful. It is just to demonstrate proper compilation behavior. In particular, I've omitted proper error checking, which I recommend you include in your actual codes.
Depending on whether your install created a symbolic link or not, you may need to change the above paths to:
-I/usr/local/cuda-9.0/include
and
-L/usr/local/cuda-9.0/lib64 -lcudart -lcufft

ImageMagick in VS2012 - 'identifier not found'

I'm trying to use ImageMagick Library for a C Project in VS2012. I installed the Library from here: klick
Then in my Project, I added D:\Program Files (x86)\ImageMagick-6.9.1-Q16\include\ to the include folders.
Then I tried to use Magick with an example code from here:
[http://www.graphicsmagick.org/1.2/www/api.html]
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <sys/types.h>
#include <magick/api.h>
int main(int argc,char **argv)
{
InitializeMagick(*argv);
GetExceptionInfo(&exception);
... ...
}
Then VS2012 returns errors when I try to compile:
error C3861: “InitializeMagick”: identifier not found
error C3861: “GetExceptionInfo”: identifier not found
error C3861: “DestroyMagick”: identifier not found
Is there any steps I missed?
Thanks very much for your help!
You need to add the .lib files to the linker.
Like setting the header include, open Properties -> Linker -> Additional Library Directories, and add path to .lib files. Then add CORE_RL_magick_.lib & CORE_RL_wand_.lib files to be linked against.
An even easier approach.
Just drag and drop said .lib's from explore into the Solution Explorer.

Where is the declaration of CPU_ALLOC?

I'm using RHEL5 kernel 2.6.33 and running GCC v4.1.2.
During my program compilation, I get the warning "implicit declaration of function CPU_ALLOC" and the error "undefined reference to 'CPU_ALLOC'. I get the same warnings and errors for CPU_ZERO_S, CPU_SET_S, CPU_FREE, numa_bitmask_alloc, numa_bitmask_setbit and numa_bitmask_free.
I understand that CPU_ALLOC should be found in sched.h, but I've searched several sched.h (/usr/include/sched.h, /usr/include/bits/sched.h, /usr/include/linux/sched.h, /usr/src/kernels/linux-2.6.33.1/include/linux/sched.h), and cannot find CPU_ALLOC.
I have tried both #include <sched.h> and #include "/usr/include/sched.h", but I still have the errors.
I found declarations of CPU_ALLOC and the other functions on this website. Is this a file that I should have on my system?
How do I resolve this problem with the CPU_* and numa_bitmask_* functions?
Thank you.
Regards,
Rayne
You need to include the following in your header file containing CPU_ALLOC.
#define _GNU_SOURCE
#include <sched.h>

Resources