digitalmars.D.learn - How to compile and link simple application?
- 4544fa8d (18/18) Apr 08 2019 Hello,
- Adam D. Ruppe (2/3) Apr 08 2019 Did you put your code inside a main() function?
- 4544fa8d (7/8) Apr 08 2019 I want to make constant with path to directory containing
- Julian (8/26) Apr 08 2019 The error message is telling you that dmd is trying to run
Hello,
I have "hello world" application. I imported std.file, executed
thisExePath() and now I have this error:
----------------------------------------------------------------
dmd -m64 -of=../../bin/manager -release ./src/manager.d
/usr/include/dmd/phobos/std/file.d(3252): Error: readlink cannot
be interpreted at compile time, because it has no available
source code
/usr/include/dmd/phobos/std/file.d(3253): called from
here: delegate () => readlink(linkz.ptr(), & buffer, 2048LU)()
/usr/include/dmd/phobos/std/file.d(3433): called from
here: readLink("/proc/self/exe")
./src/manager.d(8): called from here: thisExePath()
./src/manager.d(8): called from here:
dirName(thisExePath())
makefile:2: recipe for target 'all' failed
----------------------------------------------------------------
Whats going on? Why I cant build my executable file?
Apr 08 2019
On Monday, 8 April 2019 at 18:38:58 UTC, 4544fa8d wrote:Whats going on? Why I cant build my executable file?Did you put your code inside a main() function?
Apr 08 2019
On Monday, 8 April 2019 at 18:41:00 UTC, Adam D. Ruppe wrote:Did you put your code inside a main() function?I want to make constant with path to directory containing executable. This line is above main(): ----------------------------- const ROOT_DIR = dirName(thisExePath()); ----------------------------- This is not allowed? :O
Apr 08 2019
On Monday, 8 April 2019 at 18:47:42 UTC, 4544fa8d wrote:On Monday, 8 April 2019 at 18:41:00 UTC, Adam D. Ruppe wrote:That would give you dmd's path, if it worked. This is allowed: import std.stdio, std.path, std.file; property string root_dir() { static string cache; static bool isInit = false; if (!isInit) { isInit = true; cache = dirName(thisExePath()); } return cache; } void main() { writeln(root_dir); }Did you put your code inside a main() function?I want to make constant with path to directory containing executable. This line is above main(): ----------------------------- const ROOT_DIR = dirName(thisExePath()); ----------------------------- This is not allowed? :O
Apr 08 2019
On Monday, 8 April 2019 at 18:54:10 UTC, Julian wrote:
property
string root_dir() {
static string cache;
static bool isInit = false;
if (!isInit) {
isInit = true;
cache = dirName(thisExePath());
}
return cache;
}
Shorter:
string root_dir() {
static string cache;
return cache ? cache : (cache = dirName(thisExePath()));
}
This might spam readlink() syscalls if they somehow return the
empty string,
but how would that even happen...
Apr 08 2019
On Monday, 8 April 2019 at 19:05:33 UTC, Julian wrote:
Shorter:
string root_dir() {
static string cache;
return cache ? cache : (cache = dirName(thisExePath()));
}
This might spam readlink() syscalls if they somehow return the
It's really not possible to call functions in modules like in any
other languages? :S
---------------------------------------------------------------
import std.file;
import std.path;
import std.stdio;
//const ROOT_DIR = dirName(thisExePath());
int someInt = 0;
string someString = "sfgsdgdf";
writeln("one");
void main(){
writeln("two");
}
---------------------------------------------------------------
Apr 08 2019
On Monday, 8 April 2019 at 19:29:33 UTC, 4544fa8d wrote:It's really not possible to call functions in modules like in any other languages? :SWhat some other languages do is collect all of those calls into an implicit function that's called before main(). What D does is run that code at compile-time. Silly example: import std.stdio; T twice(T)(T n) { return 2 * n; } auto x = twice(5); void main() { writeln(x); } Take a look at the compiled result: https://godbolt.org/z/8vLsv9 There's a twice() that's compiled in, but if you look at x it's already the result of a call to twice(): int example.x: .long 10 and the (unoptimized) main just fetches that number to print.
Apr 08 2019
On Monday, 8 April 2019 at 19:43:11 UTC, Julian wrote:On Monday, 8 April 2019 at 19:29:33 UTC, 4544fa8d wrote:Another way, from https://dlang.org/spec/module.html#staticorder In thisexe.d: import std.stdio, std.path, std.file; public string root_dir; shared static this() { root_dir = dirName(thisExePath()); } In thisexe_ex.d: import thisexe, std.stdio; void main() { writeln(root_dir); } does what you'd expect.It's really not possible to call functions in modules like in any other languages? :SWhat some other languages do is collect all of those calls into an implicit function that's called before main(). What D does is run that code at compile-time.
Apr 08 2019
On Monday, 8 April 2019 at 18:38:58 UTC, 4544fa8d wrote:
Hello,
I have "hello world" application. I imported std.file, executed
thisExePath() and now I have this error:
----------------------------------------------------------------
dmd -m64 -of=../../bin/manager -release ./src/manager.d
/usr/include/dmd/phobos/std/file.d(3252): Error: readlink
cannot be interpreted at compile time, because it has no
available source code
/usr/include/dmd/phobos/std/file.d(3253): called from
here: delegate () => readlink(linkz.ptr(), & buffer, 2048LU)()
/usr/include/dmd/phobos/std/file.d(3433): called from
here: readLink("/proc/self/exe")
./src/manager.d(8): called from here: thisExePath()
./src/manager.d(8): called from here:
dirName(thisExePath())
makefile:2: recipe for target 'all' failed
----------------------------------------------------------------
Whats going on? Why I cant build my executable file?
The error message is telling you that dmd is trying to run
readlink
at compile-time. But this is probably an extern (C) symbol that
isn't
resolved except by the linker to some code in libc, which can only
happen after any compile-time computation's done.
Are you trying to get the /proc/self/exe of dmd itself?
Apr 08 2019









Julian <julian.fondren gmail.com> 