我的C ++应用程序使用dlopen
和朋友来实现一个插件系统,根据需要加载共享库。
部分应用程序是预处理器宏
#define LOG_STREAM (lock_guard<mutex>(CERR_MUTEX), cerr)
我用来保护cerr <<
表达式。 CERR_MUTEX
是一个全局std::mutex
变量,在.cpp中定义,标头中有相应的extern
声明。在整个可执行文件中使用LOG_STREAM
没有问题。
插件也使用LOG_STREAM
作为日志消息。不幸的是,插件编译因链接器错误而失败
Undefined symbols for architecture x86_64: "_CERR_MUTEX"
我使用cmake进行插件编译。 CMakeLists中的相关行是
file(GLOB WORKLOAD_SOURCES "workloads/*.cpp")
foreach(SRC ${WORKLOAD_SOURCES})
get_filename_component(WORKLOAD_NAME ${SRC} NAME_WE)
add_library(${WORKLOAD_NAME} MODULE ${SRC})
set_target_properties(${WORKLOAD_NAME} PROPERTIES ${TARGETPROPS})
target_link_libraries(${WORKLOAD_NAME} ${TBB_LIBRARIES} ${Boost_LIBRARIES})
endforeach(SRC)
我还尝试用类的静态成员替换普通的全局变量。同样的错误。
任何想法是什么原因以及如何解决它将非常感激。