我用c ++共享库代码。我正在用更新的c ++函数替换现有的c ++共享库。但是应用程序没有执行最新的代码路径,而是通过前面的代码路径,即我在新库中添加了一个带有附加消息的打印,但是我得到的打印来自之前的。
我已经使用strings命令来检查更改是否反映在较新的库中,并且它给出了积极的结果。
应用程序正在使用动态加载调用来打开库。我没有应用程序代码。
Make file具有以下用于创建共享库的标志。
${CXX} -shared -Wl,--exclude-libs,ALL,-soname,${LIB} ${LDFLAGS} -o $@ $(OBJECTS)
我缺少任何共享库标志吗?
有人知道这种奇怪的行为吗?
PS:我在嵌入式环境中运行它。
答案 0 :(得分:0)
我在这里假设一些事情:
1。您尚未使用“ - L”选项将共享库与可执行文件相关联。这永远不会卸载您的共享库。
2。使用 dlopen
在运行时打开库
运行时库交换只有在提到的2点适合您时才能工作。当打开共享库(使用dlopen)时,它会加载到程序的内存中。因此,即使您从磁盘中删除了库(在加载之后),程序仍将继续运行。
当你调用 dlclose 时,“减少动态的引用计数 库句柄。如果引用计数降至零并且 没有其他加载的库在其中使用符号,然后是动态库 已卸载。“(来自手册页)
那么,你应该做什么来实现“刷新库机制”是用dlclose关闭现有的库并用dlopen重新加载你的新库(确保新库的符号名称与旧库的符号名称相同)和访问过的符号将是新库。
因此,必须在程序中支持此类内容,或最终使用诸如 LD_PRELOAD 之类的脏黑客,这将在原始库之前预先加载您的库。但那是我认为你不想要的另一件事。