在windows下使用mingw生成动态库时出现未定义符号错误,但linux没有



我有一个名为helloworld.c的文件,它依赖于一个名为libhello.dll的外部动态库。

/* helloworld.c */
#include <stdio.h>
void hello(void);
int main() {
hello();
return 0;
}

现在我想把helloworld.c编译成一个动态库。我在windows下安装mingw,然后使用命令:

gcc -shared -fPIC -o libhelloworld.dll hello_world.c

发生了一些可怕的事情,命令报告了一个错误:

undefined reference to `hello'
collect2.exe: error: ld returned 1 exit status

我必须显式指定要编译的依赖库:

gcc -shared -fPIC -o libhelloworld.dll hello_world.c -L. -lhello

这是非常愚蠢的,这在linux中不会发生,在linux下生成动态库时允许未定义的符号,为什么在windows下不允许呢?

在生成动态库时,有没有办法使windows的行为像linux一样,而不使用-L和-L来指定动态库的路径和名称?比如添加一些编译选项等等

这个错误是有意义的:您有void hello(void);的前向声明,但没有该函数的实际实现。

所以编译器将工作(例如与gcc -c -o hello_world.o hello_world.c),但链接器不知道在哪里找到hello()函数(例如与gcc -o libhelloworld.exe hello_world.o)。

解决方案是定义hello()的实际体,或者在helloworld.c中,或者在单独的.c文件中编译并链接到相同的输出文件中,或者通过库(.a文件通过-l标志链接)。

相关内容

  • 没有找到相关文章

最新更新