【问题标题】:"Undefined reference to" issue face while build shared library on Windows using gcc of Mingw使用 Mingw 的 gcc 在 Windows 上构建共享库时出现“未定义的引用”问题
【发布时间】:2020-01-15 06:13:31
【问题描述】:

我正在尝试使用 Mingw 为 Windows 构建一个共享库 (.dll)。作为依赖项,共享库有一组 c 文件、头文件和几个静态库(*.a 用 mingw 构建)。当我尝试使用源文件和静态库构建共享库时,出现以下错误:“未定义的引用”。 该错误来自依赖于其他静态文件的静态库之一。

以下示例演示了我面临的问题

有一个文件 ops.c,构建为静态库

#include<stdio.h>

extern void print_num();

void print_num()
{
    printf("HELLO WORLD IN OPS\n");
}

用命令编译:

gcc -c ops.c -o ops.o
ar cru libops.a ops.o

第二个文件mp4.c,也是静态库构建的

#include<stdio.h>

void print_ops_num()
{
    printf("IN mp4c, will call ops\n");

    print_num();
}

用命令编译:

gcc -c mp4.c -o mp4.o
ar cru libmp4.a mp4.o

列表文件 mss.c,这将与以上 2 个静态库一起构建为共享库

#include<stdio.h>

void demo_func()
{
     printf("Demo dynamic build and linking \n");

     print_ops_num();

     print_num();

}

命令:

 gcc -o libmss.dll mss.c -o mss.o -L libops.a -L libmp4.a -Wl,--out-implib=libmss.dll.a

也用在下面

 gcc -o libmss.dll mss.c -o mss.o -L -lops -L -lmp4

构建共享库时出现以下错误

C:\Users\AppData\Local\Temp\cc6tISrV.o:mss.c:(.text+0x15): undefined reference to `print_ops_num'
C:\Users\AppData\Local\Temp\cc6tISrV.o:mss.c:(.text+0x1a): undefined reference to `print_num'
g:/work/temp/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/4.8.1/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\AppData\Local\Temp\cc6tISrV.o: ba
eloc address 0x0 in section `.pdata'
collect2.exe: error: ld returned 1 exit statusc  ops.a  ops.c  ops.o

在 linux 平台上执行相同的程序时不会出现上述问题。我是新的Windows平台,有人可以帮我解决上述问题吗?

【问题讨论】:

    标签: windows gcc makefile mingw


    【解决方案1】:

    线

    gcc -o libmss.dll mss.c -o mss.o -L libops.a -L libmp4.a -Wl,--out-implib=libmss.dll.a
    

    不正确。您正在使用 -L 标志,它将链接器指向 directories 查找库的位置。显然,这些目录 不存在,因此没有任何反应,并且您的 DLL 未链接到静态库。您需要使用-l 标志:

    gcc -shared -o libmss.dll mss.c -o mss.o -L . -l ops -l mp4 -Wl,--out-implib=libmss.dll.a
    

    这在 Linux 中起作用而不在 Windows 中起作用的原因是 DLL 需要在链接期间解析所有外部依赖项,而在 Linux 中 SO 可以有未定义的符号,这些符号只有在使用库时才会解析。

    顺便说一句,使用现代 MinGW,您无需创建导入库 (libmss.dll.a)。是否可以直接链接到 DLL。

    【讨论】:

    • 嗨雅各布,感谢您的支持。上述命令导致以下错误:g:/work/temp/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/4.8.1/../../../../ x86_64-w64-mingw32/lib/../lib/libmingw32.a(lib64_libmingw32_a-crt0_c.o):crt0_c.c text.startup+0x25): undefined reference to `WinMain' collect2.exe: error: ld returned 1 exit状态。但是,当我在 gcc 之后添加 -shared 时,没有错误,也没有生成输出(libmss.dll)。只生成了 libmss.dll.a
    • Ups,对不起,还必须有 -shared 开关才能生成动态库而不是可执行文件!
    猜你喜欢
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 2011-01-22
    相关资源
    最近更新 更多