我有一个名为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
标志链接)。