提问人:Mitchman029 提问时间:1/12/2023 更新时间:1/12/2023 访问量:149
将 .lib 文件与在 Linux 上编写的 C 代码集成
Integrating .lib files with C code written on Linux
问:
我有预先存在的代码,这些代码是在 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.c 在 Reallib.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.
答:
在 Linux 中没有正确/本机的方法来使用 Windows 库,唯一的解决方案是为目标平台重新编译库,在本例中为 Linux。.lib
选项A
只需在 Linux 中使用 GCC 或 Clang 重新编译库源代码,即可生成正确的静态库或共享库。.a
.so
选项 B
在 Windows for Linux 中安装交叉编译器,如果您熟悉它,可以使用 Cygwin。
评论
.lib
.a
.lib
.a
.a