将 .lib 文件与在 Linux 上编写的 C 代码集成

Integrating .lib files with C code written on Linux

提问人:Mitchman029 提问时间:1/12/2023 更新时间:1/12/2023 访问量:149

问:

我有预先存在的代码,这些代码是在 Linux 机器上编写并运行的。我需要添加到此代码中,此新代码依赖于使用 VS 的库。我决定使用 WSL(适用于 Linux 的 Windows 子系统)在 Visual Studio 上进行开发,然后将可执行文件/输出文件带到我的 Linux 机器并在那里运行它。

我添加的代码 myProg.c 使用来自库 Reallib.lib 的函数 Func(double arg)

我已经包含了头文件

#include "Support_Files/Reallib.h"

在我的项目属性页中,.lib 文件位于“其他依赖项”中

Support_Files/Reallib.lib

Reallib.h 文件中的声明:

long Func(double arg)

在构建时,这些是我遇到的错误:

/mnt/c/Users/mitch/Projects/myproject/myproject/myproject/obj/x64/Debug/myProg.c: in function `main':
undefined reference to Func
ld returned 1 exit status

如果我已经包含我的库,为什么会出现此错误?是因为 Linux 系统不使用 .lib 文件吗?如何将 Windows 上编写的代码与 Linux 上编写的代码相结合?

在线研究似乎与我的类似问题不匹配。

我已经尝试将 GCC 用于远程 Linux,但产生了类似的错误。但是,无论是 WSL 还是远程 Linux,似乎都无法将 .lib 文件与在 Linux 上编写的源代码相结合。

现在,我可以添加 RealFunc.c,这将清除错误,但我只会得到另一个未定义的引用错误,依此类推(RealFunc.cReallib.lib 中处理了许多其他依赖项)

常规>平台工具集>配置属性

我也尝试过只在 Linux 上开发,将 .lib 文件带过来并更新我的 makefile 以链接它,但它不起作用(我相信是因为 Linux 不使用 .lib)

我应该采取什么行动?我需要 Reallib.lib 中的代码。我是否需要咬紧牙关,从根本上重新编译 Reallib.lib 中的所有源代码?我是否需要 100% 迁移到 Linux 并使用 VS Code?我喜欢使用 VS,因为它使编译和链接选项变得更加容易。我还是 C 和 Linux 的新手。

我正在使用 Visual Studio 2022 17.4.3

WSL Ubuntu (v20.04)

$ gcc --version
gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
C Linux GCC Windows-subsystem-for-linux 未定义参考

评论

1赞 n. m. could be an AI 1/12/2023
Microsoft C++编译器编译的对象和库不能在 Linux 上使用。
0赞 Jason 1/12/2023
Linux 版本的文件是文件。文件是如何编译的?.lib.a.lib
0赞 Mitchman029 1/12/2023
@Jason .lib 文件是在 Windows 上使用 VS 编译的。(C 语言标准:默认 (旧版 MSVC)) 。我有可用的 .lib 文件的解决方案。这不可能像将配置属性> Librarian >输出文件“Reallib.lib”更改为“Reallib.a”那么简单,对吧?
0赞 Albert Shown 1/12/2023
选项 A,在 Linux 中重新编译 lib 源代码,为 Linux 创建合适的库。选项 B,将 Windows 中的 GCC 交叉编译安装到 Windows 中的重新编译库中,但会生成一个 Linux 库。.a.a

答:

1赞 Albert Shown 1/12/2023 #1

在 Linux 中没有正确/本机的方法来使用 Windows 库,唯一的解决方案是为目标平台重新编译库,在本例中为 Linux。.lib

选项A

只需在 Linux 中使用 GCC 或 Clang 重新编译库源代码,即可生成正确的静态库或共享库。.a.so

选项 B

在 Windows for Linux 中安装交叉编译器,如果您熟悉它,可以使用 Cygwin