MinGW GCC的动态链接库怎么声明一个extern接口呢?

mocom 2010-08-02 10:00:12
是这样的,动态链接库里要封装main,然后在main里extern一个MyMain,链接时提示undefined reference to 'MyMain',这问题怎么解决?
...全文
177 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
bbllgg 2010-09-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lyramilk 的回复:]
引用 2 楼 mocom 的回复:

不是,现在就是编译dll文件不了,dll的h文件里声明了个extern MyMain,然后dll的c文件里执行了MyMain,但是MyMain还没有创建,是由其他文件引用该dll时才创建

那个dll应该有个.lib文件吧,引入就可以。
或者把你这个MyMain改成函数指针,动态加载。
[/Quote]



如何引入.lib
mocom 2010-08-03
  • 打赏
  • 举报
回复
不是,是要创建个dll,而这个dll带一个extern接口
mocom 2010-08-02
  • 打赏
  • 举报
回复
IDE用的是CodeBlocks,Project类型是Shared library,编译的命令行如下:

mingw32-gcc.exe -Wall -O3 -DDLL_EXPORT -c MyDll.c -o .\MyDll.o
mingw32-g++.exe -shared -Wl,--output-def=D:\MyDll\MyDll.dll.def -Wl,--out-implib=D:\MyDll\MyDll.dll.a -Wl,--dll .\MyDll.o -o D:\MyDll\MyDll.dll -s -lfcgi

MyDll.h

#ifndef __MYDLL_H
#define __MYDLL_H

#ifdef DLL_EXPORT
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif

#ifdef __cplusplus
extern "C" {
#endif

//extern void MyMain();
DLL_API extern void MyMain();

#ifdef __cplusplus
}
#endif

#endif


MyDll.c

#include <stdio.h>
#include "MyDll.h"

int main(int argc, char *argv[]) {
MyMain();
return 0;
}


还有个情况,链接加载了个-lfcgi,这是fastcgi的WIN32库文件:libfcgi.lib,我用reimp.exe将其转换为了libfcgi.a
链接时还产生了如下错误:

undefined reference to '_imp___fcgi_sF'

因为MyDll.c里有fastcgi的IO操作

_imp___fcgi_sF的声明在fcgi_stdio.h中对应:
DLLAPI extern FCGI_FILE _fcgi_sF[];


因此有个疑问就是当链接有-shared参数时,extern函数或公共变量时,就链接不上,是不是应该有个链接参数可以在这种情况下将文件编译成dll呢?
mocom 2010-08-02
  • 打赏
  • 举报
回复
不是,现在就是编译dll文件不了,dll的h文件里声明了个extern MyMain,然后dll的c文件里执行了MyMain,但是MyMain还没有创建,是由其他文件引用该dll时才创建
  • 打赏
  • 举报
回复
链接的时候需要指定dll对应的.a文件。
lyramilk 2010-08-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mocom 的回复:]

不是,现在就是编译dll文件不了,dll的h文件里声明了个extern MyMain,然后dll的c文件里执行了MyMain,但是MyMain还没有创建,是由其他文件引用该dll时才创建
[/Quote]
那个dll应该有个.lib文件吧,引入就可以。
或者把你这个MyMain改成函数指针,动态加载。

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧