我相信我的编译器选项会发生一些非常奇怪的事情。当我编译class.c
时,它编译没有错误。但是,当我尝试创建.dll
时,我会遇到很多错误:
undefined reference to '_method'
_method
是class.c中的任意数量的方法
我使用以下代码编译代码:
gcc -c -g -w -I/path to include dir/include -MMD -MP -MF .../class.o.d -o class.o class.c
我的链接语法如下:
gcc -Wl,--add-stdcall-alias -m32 -shared -o dist/libdt.dll class.o
举一个例子,其中一个未定义的引用是undefined refence to '_min_size'
在class.c
中,它看起来像:
if(min_size){ dsize=min_size; }
min_size
中的class.c
之前没有下划线。我确定这与我的编译/链接语法有关但我只是看不到它。任何帮助表示赞赏!谢谢!
PS:我正在使用Netbeans和Cygwin。
答案 0 :(得分:0)
_只是Windows上stdcall调用约定所需的前缀,编译器会添加。
如果你有extern size_t min_size; ,你只宣布了min_size。即你告诉编译器,某处会有size_t min_size;定义。你必须在某处实际定义该变量(例如在你的class.c中,把size_t min_size放在那里。)
答案 1 :(得分:0)
更新:我再次浏览了我的编译器选项,因为我提供的选项仍然让我烦恼。我想通了:在我的class.h文件中,我有一些#if defined(__STRICT_ANSI__)
和#if defined(__WIN32__)
语句:我从未定义过这些语句。
为了将来参考我现在提供的编译器选项是:
gcc -ansi -Wall -Waggregate-return -Wcast-align -Wimplicit -Wmissing-prototypes -Wnested-externs -Wno-parentheses -DFIFO -D__Win32__ -D_NT_SOURCE -c -o class.o class.c
更改编译器选项后,我不再有任何关于未定义引用的错误!我希望将来可以帮助一些人。 :)