| Thread overview | ||||||
|---|---|---|---|---|---|---|
|
December 28, 2014 linking C++/D static library - what is "crt0.o"? | ||||
|---|---|---|---|---|
| ||||
Hi, just wondering if someone can help me out.
I'm trying to mix C++ and D code using ldc2 and clang++.
I'm using ldc 0.14.0, and the version of clang which came with Xcode(Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn))
I have two files:
<main.d>
module main;
import std.stdio;
import std.conv;
extern(C) int add(int a, int b);
void main() {
int ret = add(1, 2);
writeln("1 + 2 = " ~ to!string(ret));
}
</main.d>
<native.cpp>
extern "C" int add(int a, int b) {
return a + b;
}
</native.cpp>
When I compile the above two files as executable, everything compiles and runs fine:
> ldc2 -c -od/.../test_exec/obj/Debug main.d
> clang++ -c -working-directory /.../test_exec/obj/Debug ../../native.cpp
> clang++ -working-directory /.../test_exec /.../test_exec/obj/Debug/main.o /.../test_exec/obj/Debug/native.o /.../libdruntime-ldc.a /.../libphobos2-ldc.a -obin/Debug/test_exec
the resulting executable outputs: "1 + 2 = 3"
However, when I try to make a static library with the above files, it fails:
> ldc2 -c -od/.../test_lib/obj/Debug main.d
> clang++ -c -working-directory /.../test_lib/obj/Debug ../../native.cpp
> clang++ -static -working-directory /.../test_lib /.../test_lib/obj/Debug/main.o /.../test_lib/obj/Debug/native.o -obin/Debug/libtest_lib.a
> ld: library not found for -lcrt0.o
> clang: error: linker command failed with exit code 1 (use -v to see invocation)
So what is "-lcrt0.o" and why is clang trying to automatically add it to my static library?
| ||||
December 29, 2014 Re: linking C++/D static library - what is "crt0.o"? | ||||
|---|---|---|---|---|
| ||||
Posted in reply to bitwise | "bitwise" wrote in message news:ckjqktzsmonjdcrhkhfg@forum.dlang.org... > However, when I try to make a static library with the above files, it fails: > > > ldc2 -c -od/.../test_lib/obj/Debug main.d > > clang++ -c -working-directory /.../test_lib/obj/Debug ../../native.cpp > > clang++ -static -working-directory /.../test_lib /.../test_lib/obj/Debug/main.o /.../test_lib/obj/Debug/native.o -obin/Debug/libtest_lib.a IIRC passing -static to gcc/clang means 'statically link with C runtime libraries' not 'make a static library'. To create a static lib you need to create object files with -c and use 'ar' to create the static library. http://www.adp-gmbh.ch/cpp/gcc/create_lib.html > > ld: library not found for -lcrt0.o > > clang: error: linker command failed with exit code 1 (use -v to see invocation) > > So what is "-lcrt0.o" and why is clang trying to automatically add it to my static library? crt0.o contains the code to call C's main and a few other things. It is automatically added when building an executable. The error possibly means your system isn't set up for statically linking the cruntime. | |||
December 29, 2014 Re: linking C++/D static library - what is "crt0.o"? | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Daniel Murphy | > IIRC passing -static to gcc/clang means 'statically link with C runtime libraries' not 'make a static library'. To create a static lib you need to create object files with -c and use 'ar' to create the static library. Ah! That makes sense ;) I had actually tried ar, but misunderstood the error I was getting. After re-checking my usage, it works as expected. In the mean time, I've continued to work on this problem and found that ldc can be used to link as well: > ldc2 -lib obj/Debug/main.o obj/Debug/native.o -ofbin/Debug/libtest_lib.a and >ldc2 obj/Debug/main.o obj/Debug/native.o -L/usr/lib/libc++.dylib -ofbin/Debug/test_exec I can't think of any reason to use one over the other, so I'm inclined to go with the second option. Thanks | |||
December 29, 2014 Re: linking C++/D static library - what is "crt0.o"? | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Daniel Murphy | On 2014-12-29 05:55, Daniel Murphy wrote: > crt0.o contains the code to call C's main and a few other things. It is > automatically added when building an executable. The error possibly > means your system isn't set up for statically linking the cruntime. Yeah, OS X doesn't support static linking of the C runtime. -- /Jacob Carlborg | |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply