How to handle distributing shared libraries with different compile flags?










0















I am building a shared library which uses compiler flags to load different window manager apis:



-DVK_USE_PLATFORM_WAYLAND_KHR


and



-DVK_USE_PLATFORM_XCB_KHR


An application is then compiled against the compiled shared library with its on wayland or xcb flag.



What is the standard practice for distributing and loading the compiled library on runtime? Should I produce separate binaries (i.e. sharedlib.wayland.so and sharedlib.xcb.so), as well as separate executables (i.e. app.wayland and app.xcb) for each?










share|improve this question



















  • 2





    Is there some reason why you can't just have both, and decide which API to use based on what's available on the user's system or by user settings? I'm not a Linux user, so I don't know much about this.

    – Nicol Bolas
    Nov 14 '18 at 2:29






  • 1





    Yes, I was considering this! That would mean I'd add #include headers for both APIs for the Linux build, would that be okay?

    – coffeesaga
    Nov 14 '18 at 2:35






  • 1





    Yes, including headers for both and deciding which to use at runtime and deciding which to use at runtime is fine and probably best if you're distributing binaries.

    – Jesse Hall
    Nov 14 '18 at 3:53















0















I am building a shared library which uses compiler flags to load different window manager apis:



-DVK_USE_PLATFORM_WAYLAND_KHR


and



-DVK_USE_PLATFORM_XCB_KHR


An application is then compiled against the compiled shared library with its on wayland or xcb flag.



What is the standard practice for distributing and loading the compiled library on runtime? Should I produce separate binaries (i.e. sharedlib.wayland.so and sharedlib.xcb.so), as well as separate executables (i.e. app.wayland and app.xcb) for each?










share|improve this question



















  • 2





    Is there some reason why you can't just have both, and decide which API to use based on what's available on the user's system or by user settings? I'm not a Linux user, so I don't know much about this.

    – Nicol Bolas
    Nov 14 '18 at 2:29






  • 1





    Yes, I was considering this! That would mean I'd add #include headers for both APIs for the Linux build, would that be okay?

    – coffeesaga
    Nov 14 '18 at 2:35






  • 1





    Yes, including headers for both and deciding which to use at runtime and deciding which to use at runtime is fine and probably best if you're distributing binaries.

    – Jesse Hall
    Nov 14 '18 at 3:53













0












0








0








I am building a shared library which uses compiler flags to load different window manager apis:



-DVK_USE_PLATFORM_WAYLAND_KHR


and



-DVK_USE_PLATFORM_XCB_KHR


An application is then compiled against the compiled shared library with its on wayland or xcb flag.



What is the standard practice for distributing and loading the compiled library on runtime? Should I produce separate binaries (i.e. sharedlib.wayland.so and sharedlib.xcb.so), as well as separate executables (i.e. app.wayland and app.xcb) for each?










share|improve this question
















I am building a shared library which uses compiler flags to load different window manager apis:



-DVK_USE_PLATFORM_WAYLAND_KHR


and



-DVK_USE_PLATFORM_XCB_KHR


An application is then compiled against the compiled shared library with its on wayland or xcb flag.



What is the standard practice for distributing and loading the compiled library on runtime? Should I produce separate binaries (i.e. sharedlib.wayland.so and sharedlib.xcb.so), as well as separate executables (i.e. app.wayland and app.xcb) for each?







c++ vulkan






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 14 '18 at 2:26







coffeesaga

















asked Nov 14 '18 at 2:20









coffeesagacoffeesaga

371315




371315







  • 2





    Is there some reason why you can't just have both, and decide which API to use based on what's available on the user's system or by user settings? I'm not a Linux user, so I don't know much about this.

    – Nicol Bolas
    Nov 14 '18 at 2:29






  • 1





    Yes, I was considering this! That would mean I'd add #include headers for both APIs for the Linux build, would that be okay?

    – coffeesaga
    Nov 14 '18 at 2:35






  • 1





    Yes, including headers for both and deciding which to use at runtime and deciding which to use at runtime is fine and probably best if you're distributing binaries.

    – Jesse Hall
    Nov 14 '18 at 3:53












  • 2





    Is there some reason why you can't just have both, and decide which API to use based on what's available on the user's system or by user settings? I'm not a Linux user, so I don't know much about this.

    – Nicol Bolas
    Nov 14 '18 at 2:29






  • 1





    Yes, I was considering this! That would mean I'd add #include headers for both APIs for the Linux build, would that be okay?

    – coffeesaga
    Nov 14 '18 at 2:35






  • 1





    Yes, including headers for both and deciding which to use at runtime and deciding which to use at runtime is fine and probably best if you're distributing binaries.

    – Jesse Hall
    Nov 14 '18 at 3:53







2




2





Is there some reason why you can't just have both, and decide which API to use based on what's available on the user's system or by user settings? I'm not a Linux user, so I don't know much about this.

– Nicol Bolas
Nov 14 '18 at 2:29





Is there some reason why you can't just have both, and decide which API to use based on what's available on the user's system or by user settings? I'm not a Linux user, so I don't know much about this.

– Nicol Bolas
Nov 14 '18 at 2:29




1




1





Yes, I was considering this! That would mean I'd add #include headers for both APIs for the Linux build, would that be okay?

– coffeesaga
Nov 14 '18 at 2:35





Yes, I was considering this! That would mean I'd add #include headers for both APIs for the Linux build, would that be okay?

– coffeesaga
Nov 14 '18 at 2:35




1




1





Yes, including headers for both and deciding which to use at runtime and deciding which to use at runtime is fine and probably best if you're distributing binaries.

– Jesse Hall
Nov 14 '18 at 3:53





Yes, including headers for both and deciding which to use at runtime and deciding which to use at runtime is fine and probably best if you're distributing binaries.

– Jesse Hall
Nov 14 '18 at 3:53












1 Answer
1






active

oldest

votes


















3














As I said in the comment, I think you actually want to decide at runtime. But to answer the question you asked:



What it looks like you're doing is creating an abstract interface to any Vulkan window system, and putting different implementations of that interface into their own shared libraries. You have to name the libraries differently, e.g. libvkwsi-wayland.so, libvkwsi-xcb.so.



Usually, people will have a single executable that decides which implementation to use, and uses dlopen to load the corresponding shared library. You then need to use dlsym to get function pointers for functions in that library. If you're using C++ and the abstract interface is a literal abstract base class, then your shared libraries would have a single standalone function which creates and returns an instance of a class derived from that abstract class. The application would call that factory function, and from then on could just make virtual function calls into the object like normal.



If you want to directly link against the shared library ("-l" flag at executable link time), then you have to have a separate executable per window system (myapp-wayland, myapp-xcb, etc.). In that case, you'd probably also want to have a shell or python script that figures out which window system to use and then invokes the right executable -- that way your users don't need to know what window system they should use (fine for advanced users, not so much for most people).



Using separate executables means you're effectively distributing multiple copies of your entire application, even though nearly all of it is probably identical between window systems.






share|improve this answer






















    Your Answer






    StackExchange.ifUsing("editor", function ()
    StackExchange.using("externalEditor", function ()
    StackExchange.using("snippets", function ()
    StackExchange.snippets.init();
    );
    );
    , "code-snippets");

    StackExchange.ready(function()
    var channelOptions =
    tags: "".split(" "),
    id: "1"
    ;
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function()
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled)
    StackExchange.using("snippets", function()
    createEditor();
    );

    else
    createEditor();

    );

    function createEditor()
    StackExchange.prepareEditor(
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader:
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    ,
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    );



    );













    draft saved

    draft discarded


















    StackExchange.ready(
    function ()
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53292280%2fhow-to-handle-distributing-shared-libraries-with-different-compile-flags%23new-answer', 'question_page');

    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    3














    As I said in the comment, I think you actually want to decide at runtime. But to answer the question you asked:



    What it looks like you're doing is creating an abstract interface to any Vulkan window system, and putting different implementations of that interface into their own shared libraries. You have to name the libraries differently, e.g. libvkwsi-wayland.so, libvkwsi-xcb.so.



    Usually, people will have a single executable that decides which implementation to use, and uses dlopen to load the corresponding shared library. You then need to use dlsym to get function pointers for functions in that library. If you're using C++ and the abstract interface is a literal abstract base class, then your shared libraries would have a single standalone function which creates and returns an instance of a class derived from that abstract class. The application would call that factory function, and from then on could just make virtual function calls into the object like normal.



    If you want to directly link against the shared library ("-l" flag at executable link time), then you have to have a separate executable per window system (myapp-wayland, myapp-xcb, etc.). In that case, you'd probably also want to have a shell or python script that figures out which window system to use and then invokes the right executable -- that way your users don't need to know what window system they should use (fine for advanced users, not so much for most people).



    Using separate executables means you're effectively distributing multiple copies of your entire application, even though nearly all of it is probably identical between window systems.






    share|improve this answer



























      3














      As I said in the comment, I think you actually want to decide at runtime. But to answer the question you asked:



      What it looks like you're doing is creating an abstract interface to any Vulkan window system, and putting different implementations of that interface into their own shared libraries. You have to name the libraries differently, e.g. libvkwsi-wayland.so, libvkwsi-xcb.so.



      Usually, people will have a single executable that decides which implementation to use, and uses dlopen to load the corresponding shared library. You then need to use dlsym to get function pointers for functions in that library. If you're using C++ and the abstract interface is a literal abstract base class, then your shared libraries would have a single standalone function which creates and returns an instance of a class derived from that abstract class. The application would call that factory function, and from then on could just make virtual function calls into the object like normal.



      If you want to directly link against the shared library ("-l" flag at executable link time), then you have to have a separate executable per window system (myapp-wayland, myapp-xcb, etc.). In that case, you'd probably also want to have a shell or python script that figures out which window system to use and then invokes the right executable -- that way your users don't need to know what window system they should use (fine for advanced users, not so much for most people).



      Using separate executables means you're effectively distributing multiple copies of your entire application, even though nearly all of it is probably identical between window systems.






      share|improve this answer

























        3












        3








        3







        As I said in the comment, I think you actually want to decide at runtime. But to answer the question you asked:



        What it looks like you're doing is creating an abstract interface to any Vulkan window system, and putting different implementations of that interface into their own shared libraries. You have to name the libraries differently, e.g. libvkwsi-wayland.so, libvkwsi-xcb.so.



        Usually, people will have a single executable that decides which implementation to use, and uses dlopen to load the corresponding shared library. You then need to use dlsym to get function pointers for functions in that library. If you're using C++ and the abstract interface is a literal abstract base class, then your shared libraries would have a single standalone function which creates and returns an instance of a class derived from that abstract class. The application would call that factory function, and from then on could just make virtual function calls into the object like normal.



        If you want to directly link against the shared library ("-l" flag at executable link time), then you have to have a separate executable per window system (myapp-wayland, myapp-xcb, etc.). In that case, you'd probably also want to have a shell or python script that figures out which window system to use and then invokes the right executable -- that way your users don't need to know what window system they should use (fine for advanced users, not so much for most people).



        Using separate executables means you're effectively distributing multiple copies of your entire application, even though nearly all of it is probably identical between window systems.






        share|improve this answer













        As I said in the comment, I think you actually want to decide at runtime. But to answer the question you asked:



        What it looks like you're doing is creating an abstract interface to any Vulkan window system, and putting different implementations of that interface into their own shared libraries. You have to name the libraries differently, e.g. libvkwsi-wayland.so, libvkwsi-xcb.so.



        Usually, people will have a single executable that decides which implementation to use, and uses dlopen to load the corresponding shared library. You then need to use dlsym to get function pointers for functions in that library. If you're using C++ and the abstract interface is a literal abstract base class, then your shared libraries would have a single standalone function which creates and returns an instance of a class derived from that abstract class. The application would call that factory function, and from then on could just make virtual function calls into the object like normal.



        If you want to directly link against the shared library ("-l" flag at executable link time), then you have to have a separate executable per window system (myapp-wayland, myapp-xcb, etc.). In that case, you'd probably also want to have a shell or python script that figures out which window system to use and then invokes the right executable -- that way your users don't need to know what window system they should use (fine for advanced users, not so much for most people).



        Using separate executables means you're effectively distributing multiple copies of your entire application, even though nearly all of it is probably identical between window systems.







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 14 '18 at 4:02









        Jesse HallJesse Hall

        3,6821220




        3,6821220



























            draft saved

            draft discarded
















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid


            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.

            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53292280%2fhow-to-handle-distributing-shared-libraries-with-different-compile-flags%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            這個網誌中的熱門文章

            How to read a connectionString WITH PROVIDER in .NET Core?

            In R, how to develop a multiplot heatmap.2 figure showing key labels successfully

            Museum of Modern and Contemporary Art of Trento and Rovereto