从 Linux 动态库/Linux 控制台应用程序导出/导入 C++ 函数 | Visual Studio Linux 项目
Posted
技术标签:
【中文标题】从 Linux 动态库/Linux 控制台应用程序导出/导入 C++ 函数 | Visual Studio Linux 项目【英文标题】:Exporting / Importing C++ Functions from Linux Dynamic Library / Linux Console App | Visual Studio Linux Projects 【发布时间】:2016-08-27 16:53:00 【问题描述】:我想从 Linux C++ .so
共享对象库中导出全局 C++ 函数,并在 Linux C++ .out
应用程序中使用这些函数。
我查看了一些在 Linux 开发环境中通常如何完成此操作的示例。但是我正在使用 Visual Studio Linux 项目和新的 Visual C++ for Linux Development 扩展。我相信我看到的示例中的许多步骤都将由 Visual Studio 构建系统处理,因此在这种情况下情况似乎有些不同。
我在 Visual Studio 中创建了两个 Linux C++ 项目,一个是我在属性中更改为 .so
的空项目和一个控制台应用程序。我已经在控制台应用程序中引用了共享对象库。
共享对象库项目有两个文件,functions.h
和 functions.cpp
。
函数.h
#pragma once
void Function_01();
functions.cpp
#include functions.h
extern "C" void Function_01()
return 0;
我已将functions.h
文件添加到消费控制台应用程序...
#include <cstdio>
#include "functions.h"
int main()
Function_01();
return 0;
也许导出全局函数看起来很奇怪,但对于我的问题,这似乎是最自然的方法,我打算在库构建和链接后将函数包装在命名空间中。
我做错了什么?如何链接这些 Visual C++ for Linux 开发项目并使用从共享对象库导出的函数?
【问题讨论】:
这可能相关:gcc.gnu.org/wiki/Visibility 【参考方案1】:默认情况下会导出库函数,因此您只需在代码中调用它们并在使用 gcc 构建应用程序时链接到库。你的目标是一个看起来像这样的命令行:
g++ -o myprog myprog.cpp -lfunctions -L/home/test/projects/mylibs
地点:
myprog 是您的控制台应用程序的可执行文件,您可以使用./myprog
从命令行运行它
functions
指的是您的共享对象库,它是一个名为 libfunctions.so 的文件('lib' 和 '.so' 会自动预先添加和附加)
libfunctions.so 可以在文件夹 /home/test/projects/mylibs 中找到
在 Visual C++ for Linux Development (VCLinux) 中,您将在 Linker / Input / Library Dependencies 下的项目设置中指定库的名称 functions
以及可以在下面找到库的文件夹的路径链接器/常规/附加库目录。 IE。就像将 DLL 与 Windows 应用程序链接时一样。
VCLinux 提供了 Visual Studio 用户熟悉的开发环境。但值得注意的是,虽然 VCLinux 生成 g++ 命令来编译和链接您的应用程序,但您所学到的关于使用 gcc 在 Linux 上构建应用程序的知识都非常适用。虽然您现在可以跳过 makefile 章节。
另外请注意,VCLinux 是一项正在进行中的工作。调试共享库有几个问题,特别是使用测试控制台应用程序 - 可以在 VCLinux GitHub project page 上找到更多信息。我们鼓励您积极并提供建设性的反馈。
【讨论】:
感谢您的信息。我无法让您的示例正常工作,可能是因为它是我要链接到的共享库,而-lfunctions
选项似乎适用于静态 .a
库。我发现在命令行上指定libFuntions.so.1.0
库的完整路径是可行的。在 Visual Studio 中,这对应于在 Linker > Input > Additional Dependencies 中输入完整路径。但是我需要调试链接的共享对象库。当前设置中未启用对库的调试...有关如何启用对共享对象库的调试的任何想法?
链接到共享库与静态库相同。这是您需要正确设置路径的-L
和库名称-l
的组合。我建议您增加输出详细程度并检查编译器和链接器命令行。你应该会发现,你做的方式和我的建议其实是一样的。 Details here:.
要在 VCLinux 中使用调试器进入共享库,您必须在 gdb 模式下进行调试(其中 gdb 完全在远程系统上运行)。请参阅项目设置中的调试/调试模式。这有其自身的问题,已在 VCLinux GitHub project site 上提出。以上是关于从 Linux 动态库/Linux 控制台应用程序导出/导入 C++ 函数 | Visual Studio Linux 项目的主要内容,如果未能解决你的问题,请参考以下文章
linux找动态链接库默认位置,linux动态链接库的加载顺序,编译时找静态库默认位置,找动态库,找静态库
linux找动态链接库默认位置,linux动态链接库的加载顺序,编译时找静态库默认位置,找动态库,找静态库