digitalmars.D.learn - What is this undefined reference with -betterC about?
Here's a complete script that you can run right now, using a dub module that I just updated: ```d /+ dub.sdl: dependency "hostname" version="~>0.1.1" buildOptions "betterC" +/ extern(C) void main() { import hostname : hostnamez; import core.stdc.stdio : printf; printf("hostname: %s", hostnamez); } ``` ... which fails: ``` /usr/bin/ld: /tmp/.dub/build/hostnameex2-~master/application-debug-linux.posix-x86_64-dmd_v2.097.0-96F370DD71342805A23ECDFD2C6 CE6C/hostnameex2.o: in function `main': /home/jfondren/mars/learn/./hostnameex2.d:11: undefined reference to `_D8hostname9hostnamezPa' ``` I've rm -rf'd /tmp/.dub and ~/.dub/packages , I've gotten things to a point where I could modify dub's cached hostname/source.d and confirm that e.g. pragma(msg, hostnamez.mangleof) has exactly the same output in that file as in the script above. This all works fine if instead of a dub dependency I add the path to hostname.d in dflags. And this script works fine, without betterC: ```d /+ dub.sdl: dependency "hostname" version="~>0.1.1" +/ void main() { import std.stdio : writeln; import hostname : hostname, hostnamez; import std.string : fromStringz; writeln("hostname: ", hostname); writeln("hostname: ", hostnamez.fromStringz); } ``` Why isn't this linking?
Jun 16 2021
On Wednesday, 16 June 2021 at 14:21:40 UTC, jfondren wrote:Why isn't this linking?OK, with verbose commands I see that libhostname.a is built without -betterC So that's why this fails to link. What do I change to 1. a script like this that uses hostname 2. the hostname module so that both can be built with -betterC when and only when the script is using -betterC?
Jun 16 2021
On Wednesday, 16 June 2021 at 14:38:10 UTC, jfondren wrote:What do I change to 1. a script like this that uses hostname 2. the hostname module so that both can be built with -betterC when and only when the script is using -betterC?That's currently the situation: you can only build when both are betterC or else you get a linker error. It has to be a linker error, dmd cannot know at the time of compiling project A how project B is going to be compiled and vice versa. It noticed your code looks like this: ```D version(D_BetterC) { char* hostnamez; } else { immutable char* hostnamez; } ``` The different types result in different mangles, causing the linking errors. Why not simply give them the same type?
Jun 16 2021
On Wednesday, 16 June 2021 at 16:27:13 UTC, Dennis wrote:It has to be a linker error, dmd cannot know at the time of compiling project A how project B is going to be compiled and vice versa.Well I suppose you could use a specific dub configuration, maybe giving 'hostname' a targetType "sourceLibrary" or something, but I would just make the abi consistent.
Jun 16 2021
On Wednesday, 16 June 2021 at 16:27:13 UTC, Dennis wrote:On Wednesday, 16 June 2021 at 14:38:10 UTC, jfondren wrote:It's dub that's calling dmd though. Cargo handles this situation with features: https://doc.rust-lang.org/cargo/reference/features.html Where this case would look something like ``` [dependencies] hostname = { version = "0.1.1", features = ["betterC"] } ``` in the script's dub config that uses hostname. I feel like I've seen similar configurations in dub configs, but I see nothing about this in the documentation.What do I change to 1. a script like this that uses hostname 2. the hostname module so that both can be built with -betterC when and only when the script is using -betterC?That's currently the situation: you can only build when both are betterC or else you get a linker error. It has to be a linker error, dmd cannot know at the time of compiling project A how project B is going to be compiled and vice versa.It noticed your code looks like this: ```D version(D_BetterC) { char* hostnamez; } else { immutable char* hostnamez; } ``` The different types result in different mangles, causing the linking errors. Why not simply give them the same type?the pragma(crt_constructor) function can't initialize immutables: https://forum.dlang.org/post/wvjfygxfvmoaortmndcv forum.dlang.org
Jun 16 2021