使用 C 应用程序加载的C++插件中的C++库
Using C++ library from a C++ plugin loaded by a C app
我有一个用C++写的lib(.so)。如果我这样做nm mylib.so
我会得到00000000000029a0 T _ZN4Bits7fromMemEPhl
(除其他外)。
另一方面,我有一个用C编写的应用程序,它加载了一些用C++编写的插件(dlopen,dlsym等)。
如果我尝试从我的 c++ 插件中使用我的库,我会得到undefined symbol: _ZN4Bits7fromMemEPhl
.为什么?
编辑:
这就是我编译插件的方式:
$(PLUGINS_DIR)/%.so: $(PLUGINS_DIR)/%.o
$(CXX) $^ -o $@ -shared
$(PLUGINS_DIR)/%.o: $(PLUGINS_DIR)/%.cpp
$(CXX) -c $< -o $@ -g -Wall -std=c++11 -pedantic -lcpp-bitstring -fPIC -I.,-rpath=$(LIBS_DIR)/cpp-bitstring
这就是我编译主应用程序的方式:
$(TARGET): $(TARGET).o
$(CC) -o $@ $^ -g -Wall -std=gnu99 -ldl -lcrypto -Wl,--export-dynamic
编辑:
问题很明显。由于某种原因,我的库(cpp-bitstring)没有链接到我的插件。我缺少的代码段在哪里?
创建共享对象时,如果您希望在动态加载插件时拾取库,则必须提供库依赖项。
下面是一个简单的生成文件:
plugin.o: CXXFLAGS += -fPIC
main: LDFLAGS += -ldl
all: main plugin.so
plugin.so: plugin.o
$(CXX) $^ -o $@ -shared -lreadline
main.c
文件如下所示:
#include <dlfcn.h>
#include <assert.h>
int
main (void)
{
void *p = dlopen("./plugin.so", RTLD_NOW);
assert(p);
void (*do_stuff)(void) = dlsym(p, "do_stuff");
assert(do_stuff);
do_stuff();
dlclose(p);
return 0;
}
plugin.cpp
文件如下所示:
#include <iostream>
#include <stdlib.h>
#include <readline/readline.h>
extern "C" void do_stuff (void) {
while (char *s = readline("> ")) {
std::cout << "- " << s << std::endl;
free(s);
}
std::cout << std::endl;
}
相关文章:
- 从C++本机插件更新Vector3数组
- 使用CMake创建QML插件
- 停止cmake target_link_libraries将插件中静态库的两个对象文件链接到静态库本身
- 如何创建从Maya(或类似程序)到虚幻引擎的自定义数据导出插件
- clang 插件:在编译过程中修改 AST
- 实现动态插件管理器
- 我想通过带有C++和Python的插件创建一个可扩展的应用程序
- Agora.io 虚幻引擎插件构建错误
- 使用带有C++对象和标准库容器的插件系统
- 运行命令 "rosbag play example.bag" 时出错。找不到与插件 rosbag/NoEncryptor 对应的库
- 编译 llvm 插件时出现问题:llvm/Config/llvm-config.h:没有这样的文件或目录
- 通过 Gazebo 世界插件将静态对象附加到机器人链接
- 如何为模块化应用程序实现C++插件系统
- 'string'文件在带有C++文件的iOS插件上找不到
- 在 Android 上安装 GStreamer 插件
- 如何使用MSVC 2019创建和使用Qt 5.14.0自定义小工具插件
- 如何在 Windows 操作系统中在 geany 中安装插件
- 节点插件 API 将数组作为函数参数传递
- OpenVINO - 推理库插件 libMKLDNNPlugin.so 无法解析依赖关系
- 通过 Flutter 从C++插件访问资产