digitalmars.D.learn - Making a D library for a C executable
- Jan Allersma (33/33) Apr 27 2023 Hello,
- Mike Parker (10/13) Apr 27 2023 That's a compilation error, not a linker problem. You need to
- Jan Allersma (9/11) Apr 27 2023 Declaring the function does fix the compiler problem. However, I
- Steven Schveighoffer (6/21) Apr 27 2023 You may have to link the library second. Sometimes linkers are
- Jan Allersma (6/8) Apr 28 2023 Hi Steve,
- Jan Allersma (26/29) Apr 28 2023 I used to `dub run` to solve the problem, nothing special. My
Hello, I see some examples on the internet on how to call C(++) in D. But I want to do it the other way around. Because of (probably) linkage issues, this way seems easier. I have this D code: ``` import std.stdio; int maint() { writeln("Returning some random stuff..."); return 10; } extern (C++) int foo() { return maint(); } ``` And this CPP source file: ``` #include <iostream> int main() { std::cout << "deede" << foo() << std::endl; } ``` This is some gibberish, but the point is that foo needs to be called from the D source file. In Bash I compile it and get a response: ``` $ g++ ../build/libshared-api.so main.cpp main.cpp: In function ‘int main()’: main.cpp:4:27: error: ‘foo’ was not declared in this scope 4 | std::cout << "deede" << foo() << std::endl; | ``` Apparently foo isn't found from the CPP source file. Anyone some ideas on how to solve this? :)
Apr 27 2023
On Thursday, 27 April 2023 at 20:32:24 UTC, Jan Allersma wrote:``` Apparently foo isn't found from the CPP source file. Anyone some ideas on how to solve this? :)That's a compilation error, not a linker problem. You need to tell the compiler about the function with a prototype: ```C++ #include <iostream> int foo(); int main() { std::cout << "deede" << foo() << std::endl; } ```
Apr 27 2023
On Thursday, 27 April 2023 at 21:05:00 UTC, Mike Parker wrote:That's a compilation error, not a linker problem. You need to tell the compiler about the function with a prototype:Declaring the function does fix the compiler problem. However, I do get a linker error once I compile that: ```bash $ g++ ../build/libshared-api.so main.cpp /usr/bin/ld: /tmp/ccNMKxEE.o: in function `main': main.cpp:(.text+0x2a): undefined reference to `foo()' collect2: error: ld returned 1 exit status ```
Apr 27 2023
On 4/27/23 5:29 PM, Jan Allersma wrote:On Thursday, 27 April 2023 at 21:05:00 UTC, Mike Parker wrote:You may have to link the library second. Sometimes linkers are particular about object order. Also, please include your commands for building the D library so reproduction is possible. -SteveThat's a compilation error, not a linker problem. You need to tell the compiler about the function with a prototype:Declaring the function does fix the compiler problem. However, I do get a linker error once I compile that: ```bash $ g++ ../build/libshared-api.so main.cpp /usr/bin/ld: /tmp/ccNMKxEE.o: in function `main': main.cpp:(.text+0x2a): undefined reference to `foo()' collect2: error: ld returned 1 exit status ```
Apr 27 2023
On Thursday, 27 April 2023 at 21:34:17 UTC, Steven Schveighoffer wrote:You may have to link the library second. Sometimes linkers are particular about object order.Hi Steve, Your suggestion worked! Reversing the order solved the problem. I have another problem that I'm facing, but that is something hardly related to this so I'll open a new thread. Thanks :)
Apr 28 2023
On Thursday, 27 April 2023 at 21:34:17 UTC, Steven Schveighoffer wrote:Also, please include your commands for building the D library so reproduction is possible. -SteveI used to `dub run` to solve the problem, nothing special. My `dub.json` isn't that interesting either, but I'll show it anyway for the sake of reproduction purposes: ```json { "authors": [ "Jan Allersma" ], "copyright": "Copyright © 2023, Jan Allersma", "dependencies": { "d2sqlite3": "~>1.0.0", "secured": "~>2.0.2" }, "description": "A minimal D application.", "license": "proprietary", "name": "shared-api", "targetType": "dynamicLibrary", "targetPath": "../build" } ``` For people that use a Linux machine and don't have experience with using shared libraries just like me: Don't forget to add your shared library to a library path (e.g. `/usr/local/lib`). And just to be sure, I also executed `ldconfig` in Bash.
Apr 28 2023