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)