gpt4 book ai didi

c++ - 访问可执行文件的全局变量时出现共享库链接器错误

转载 作者:太空宇宙 更新时间:2023-11-04 13:12:48 25 4
gpt4 key购买 nike

我的 C++ 应用程序使用 dlopen和 friend 一起实现一个插件系统,在必要时加载共享库。

应用程序的一部分是预处理器宏

#define LOG_STREAM (lock_guard<mutex>(CERR_MUTEX), cerr)

我用来保护 cerr <<表达式。 CERR_MUTEX是全局std::mutex在具有相应 extern 的 .cpp 中定义的变量 header 中的声明。 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)

我还尝试用类的静态成员替换普通全局变量。同样的错误。

任何想法是什么原因以及如何解决它将不胜感激。

最佳答案

最终,链接器无法找到该变量,因为插件未链接到可执行文件,并且看不到那里的定义。

碰巧,编译对插件的其余部分有效,因为其他符号都链接为 weak symbol ,在链接期间不需要定义。

我将重构应用程序并将插件所需的类型移动到专用的共享库中。该库可以通过可执行文件和类似的插件链接。

关于c++ - 访问可执行文件的全局变量时出现共享库链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38959956/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com