Hi there,
I successfully compiled Cling on windows (VS 2017) and am just starting to play with it, I must say I’m starting to love it!
Now I would like to also use TBB in my project, so I created a simple app, in which I link tbb.lib.
The problem is as soon as I add the include (in my case #include “tbb\flow_graph.h”), I getting this error:
In file included from input_line_3:1:
In file included from C:\ThirdPartyLibs\tbb2018_20170919oss\include\tbb\flow_graph.h:24:
In file included from C:\ThirdPartyLibs\tbb2018_20170919oss\include\tbb/tbb_stddef.h:123:
C:\ThirdPartyLibs\tbb2018_20170919oss\include\tbb/internal/_tbb_windef.h:32:2: error: TBB requires linkage with multithreaded C/C++ runtime library. Choose multithreaded DLL runtime in project settings, or
use /MD[d] compiler switch.
#error TBB requires linkage with multithreaded C/C++ runtime library. \
Of course my app is compiled with the /MD flag.
Any help will be appreciated!
Hi there. Did you compile cling with /MD?
Hi, yes I did, So I tried 2 things, the first one was to load the tbb. lib +the headers in cling.exe,
then to create my own app with an interpreter and tbb.lib linked to that app:
#include "tbb\flow_graph.h"
#include "cling/Interpreter/Interpreter.h"
#include "cling/MetaProcessor/MetaProcessor.h"
#include "cling/UserInterface/UserInterface.h"
#include "clang/Basic/LangOptions.h"
#include "clang/Frontend/CompilerInstance.h"
#include "clang/FrontendTool/Utils.h"
#include "llvm/Support/Signals.h"
#include "llvm/Support/PrettyStackTrace.h"
#include "llvm/Support/ManagedStatic.h"
#include <stdarg.h>
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <string>
#if defined(WIN32) && defined(_MSC_VER)
#include <crtdbg.h>
#endif
int main(int argc, const char* const* argv)
{
cling::Interpreter interp(argc, argv, LLVMRESDIR);
interp.AddIncludePath("C:\\ThirdPartyLibs\\tbb2018_20170919oss\\include");
interp.loadLibrary("C:\\ThirdPartyLibs\\tbb2018_20170919oss\\lib\\ia32\\vc14\\tbb.lib");
interp.process("#include \"tbb\\flow_graph.h\"");
return 0;
}
Both compiled with /MD, but none worked
Cling does not full support of Windows. That said, it looks like that’s the failing code
#if !defined(_MT)
#error TBB requires linkage with multithreaded C/C++ runtime library. \
Choose multithreaded DLL runtime in project settings, or use /MD[d] compiler switch.
#endif
This means that cling is not defining _MT in its runtime even though it was built with /MD. To implement the semantics of MD might be tricky we need also to load msvcrt according to documentation.
You could try two things. First try starting cling /MD and see if the runtime will define _MT. If that does not work you could force it to be defined in a similar to that manner.
Thanks Vassil,
adding
interp.process("#define _MT");
allowed me to include TBB!!!
now I’m facing another problem, using a tbb for loop like this:
tbb::parallel_for(size_t(0), size_t(5), [=](size_t i) {
printf("i is %d", int(i));
});
is giving this error:
LLVM ERROR: ELF COMDATs only support SelectionKind::Any, ‘??_7task@tbb@@6B@’ cannot be lowered.
and this flow graph example is crashing:
#include "tbb/flow_graph.h"
#include <iostream>
using namespace std;
using namespace tbb::flow;
int main() {
graph g;
continue_node< continue_msg> hello( g,
[]( const continue_msg &) {
cout << "Hello";
}
);
continue_node< continue_msg> world( g,
[]( const continue_msg &) {
cout << " World\n";
}
);
make_edge(hello, world);
hello.try_put(continue_msg());
g.wait_for_all();
return 0;
}
I think you are hitting this, unrelated to tbb, issue: Exception when using virtual functions (on windows)
Hi Vassil,
So as TBB is already a compiled lib, it seems this is a dead end for now right?
I’ll try to stick with openMP then.
Thanks anyway 