c++ - 从 Linux 动态库/Linux 控制台应用程序导出/导入 C++ 函数 | Visual Studio Linux 项目

标签 c++ linux visual-studio visual-c++ shared-libraries

我想从 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();

函数.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 Development 项目并使用从共享对象库导出的函数?

最佳答案

默认情况下会导出库函数,因此您只需在代码中调用它们并在使用 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 以及库所在文件夹的路径可以在 Linker/General/Additional Library Directorys 下找到。 IE。就像将 DLL 与 Windows 应用程序链接时一样。

VCLinux 提供了 Visual Studio 用户熟悉的开发环境。但值得注意的是,虽然 VCLinux 生成 g++ 命令来编译和链接您的应用程序,但您所学到的关于使用 gcc 在 Linux 上构建应用程序的知识非常适用。尽管您现在可以跳过 makefile 章节。

另请注意,VCLinux 还在不断完善中。调试共享库有几个问题,特别是使用测试控制台应用程序 - 更多信息可以在 VCLinux GitHub project page 上找到.我们鼓励您积极并提供建设性反馈。

关于c++ - 从 Linux 动态库/Linux 控制台应用程序导出/导入 C++ 函数 | Visual Studio Linux 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39183549/

相关文章:

php 获取空闲空间/dev/sda linux

C# 单元测试资源

javascript - Visual Studio 2008 jQuery IntelliSense偶尔失败,重新启动VS修复

c# - 如何获得本地 Visual Studio 构建完成的通知?

c++ - "Cannot execute binary file"在 Ubuntu for Windows 平台上使用 Eclipse 运行已编译的 c++ 程序时

c++ - If 条件检查 Cout

c++ - 如何在非类型模板类的专门化声明之外定义方法?

C++ Boost::thread 可升级互斥量 "try upgrade lock"?

linux - 同时执行 awk 和 sed 命令

linux - bash 脚本中的参数数量