Monday, May 9, 2022

[SOLVED] create shared library with main to call undefined function and provide function body in other project

Issue

I need to create a shared library using cmake, and I must call function run() in a library function. But the project which uses this library should provide the body of this function.

The real cases use systemC which force library to implement main function. To avoid further complexity, I try to simplify the case like this:

MyInterface.h

void run();

MyLibraryAction.cpp

#include "MyInterface.h"

int main(){
    run();
}

The cmake content is:

add_library(mylib SHARED MyLibraryAction.cpp)

set_target_properties(mylib PROPERTIES PUBLIC_HEADER MyInterface.h)

configure_file(mylib.pc.in mylib.pc @ONLY)

install(
  TARGETS mylib
  DESTINATION ${CMAKE_INSTALL_LIBDIR}
  PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})

install(FILES ${CMAKE_BINARY_DIR}/mylib.pc
        DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig)

I am wondering if that is possible. If so, am I doing it right? is using extern relevant in this context? I am get error when I try to build and create the library:

undefined reference to run()


Solution

As mentioned in the comments, weak symbols worked fine in this case.

MyInterface.h

void run();

and then have an implementation for run function with weak symbol:

InterfaceWeakImplementation.h

void __attribute__((weak)) run(){
    // pass
}

and have the actual implementation in caller project

InterfaceStrongImplementation.h

void run(){
    // Some real work
}


Answered By - Aryan Firouzian
Answer Checked By - David Marino (WPSolving Volunteer)