使用 main 创建共享库以调用未定义的函数并在其他项目中提供函数体

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

我需要使用 cmake 创建一个共享库,并且我必须在库函数中调用函数 run()。但是使用这个库的项目应该提供这个函数的主体。

真实案例使用systemC强制库实现main函数。为了避免进一步的复杂性,我尝试像这样简化案例:

MyInterface.h

void run();

MyLibraryAction.cpp

#include "MyInterface.h"

int main(){
    run();
}

cmake内容为:

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)

我想知道这是否可能。如果是这样,我这样做对吗?在这种情况下使用 extern 是否相关? 当我尝试构建和创建库时出现错误:

undefined reference to run()

如评论中所述,弱符号在这种情况下效果很好。

MyInterface.h

void run();

然后用弱符号实现 run 函数:

InterfaceWeakImplementation.h

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

并在调用方项目中进行实际实现

InterfaceStrongImplementation.h

void run(){
    // Some real work
}