C++ 如何使用外部库中的函数?

C++ 如何使用外部库中的函数?,c++,c,cmake,execute,C++,C,Cmake,Execute,我正在通过glc捕获启动OpenGL应用程序。glc是一个c库,它钩住了OpenGL缓冲区和x11服务器。 glc需要OpenGL显示中的一个键命令来开始记录OpenGL输出 但是我的软件应该开始以编程方式记录输出,而不是通过按键。 glc文件太复杂了,我的基本知识无法完全理解它们。 但基本上结构如下所示: 是一个shell脚本,它执行一些设置并执行LD_PRELOAD=libglc-capture.so“${@}”。包含用于侦听密钥事件的x11挂钩。正在进行一些初始化。 在特殊按键事件中,函数

我正在通过glc捕获启动OpenGL应用程序。glc是一个c库,它钩住了OpenGL缓冲区和x11服务器。 glc需要OpenGL显示中的一个键命令来开始记录OpenGL输出

但是我的软件应该开始以编程方式记录输出,而不是通过按键。 glc文件太复杂了,我的基本知识无法完全理解它们。 但基本上结构如下所示:

是一个shell脚本,它执行一些设置并执行
LD_PRELOAD=libglc-capture.so“${@}”
。包含用于侦听密钥事件的x11挂钩。正在进行一些初始化。 在特殊按键事件中,函数
start\u capture()
由执行。
start\u capture()
在文件中定义并在文件中实现

我的问题: 如何在我自己的C++应用程序上执行StaskSCAPETION()函数?< /强> 我试图通过
CMakeList.txt
链接库(hook和capture),并包含头文件,但这总是让我处于“未定义引用:start_capture()”状态

以下是链接库的CMakeList.txt中的行:

target_link_libraries(${PROJECT_NAME} ${QT_LIBRARIES} libglc-hook.so libglc-capture.so libglc-core.so libglc-export.so)
编辑2: 以下是我在运行时遇到的错误:

/opt/ros/fuerte/stacks/visualization/rviz/bin/rviz:符号查找 错误: /home/jrick/fuerte_workspace/sandbox/Bag2Film/lib/libBag2Film.so: 未定义的符号:开始捕获

nm的输出:

jrick@robot2:~/fuerte_工作区/sandbox/Bag2Film/lib$nm libBag2Film.so | grep捕获

000000000000 3A30无法启动捕获

0000000000003790 t停止捕捉


我不知道glc capture,但根据您的说法,应该可以直接将应用程序链接到libglc capture(尝试将
-lglc capture
作为链接器标志传递)。如果不起作用,请查阅图书馆文档

此外,还必须包含一个头文件,其中包含
start\u capture
的声明。同样,请参阅库文档以了解要使用的文件。如果不存在头,您仍然可以自己声明它(听起来像是一个C库,因此类似于
extern“C”{void start_capture();}
的东西可能会这样做

如果您的项目在这些更改后仍在编译和链接,请在需要的地方添加对
start\u capture()
的调用


如果没有帮助,请回到这里。< / P>你能显示链接的CMAKLIST吗?我把链接添加到了链接中。或者你需要ToxTXT文件吗?你确定你需要.so文件扩展吗?那个LIB。h不是C++安全的,如果你想用C++代码调用它,你需要添加外部的“C”。是的,没有它们就无法编译。啊,谢谢你的提示!谢谢你的回答。我在lib.h中添加了'extern“C”{int start_capture();}',并删除了旧的include。lib.h包含在我的类中。但是一旦我执行start_capture();我收到一个未定义的符号错误。头文件lib.h知道在哪里可以找到实现吗?嗯…这似乎不对。通常,您无法执行链接器未找到的函数。错误是否在编译时、链接时或运行时出现?请发布错误消息。错误仅在运行时出现。我不确定现在我修改了原来的lib.h并把它放在我的src文件夹中,将它添加到我的CMakeList.txt中。在lib.h中,我添加了extern“C”如果函数有一个<代码> LIB。h <代码>声明“代码> StastCopys<代码>应该是好的。你必须确定它是C还是C++头。如果它是C,而你自己的程序是C++,你应该把包括在。尽管如此,准确的错误消息还是会有帮助的。再次感谢您的帮助。我添加了“立即包含lib.h”的环绕,但它没有改变任何内容。还有其他想法吗?我用完整的错误更新了主要问题。