从 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.hfunctions.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动态链接库的加载顺序,编译时找静态库默认位置,找动态库,找静态库

Linux下gcc编译控制动态库导出函数小结

动态库与静态库的区别在windows及linux环境下的制作及用法

Ubuntu linux设置从当前目录下加载动态库so文件

linux 动态静态库