在linux(ubuntu)上的现有c ++项目的Makefile.in中,它有:
EXPORTS = \
gtkmozembed.h \
gtkmozembed_glue.cpp \
gtkmozembed_internal.h
请告诉我EXPORTS的含义是什么?
谢谢。
答案 0 :(得分:1)
EXPORTS只是文件列表的名称。这可能意味着这些文件正被安装到其他人可以使用它们的位置。具有库不是用户感兴趣的实现细节的头文件可以保密。
EXPORTS中的.cpp文件可能意味着它包含用户必须编译并链接到其项目中的框架代码。
您的示例来自Firefox。它被定义为:
export:: $(EXPORTS)
$(INSTALL) -m 444 $^ $(PUBLIC_EXPORT_DIR)
在Makefile中复制或安装文件有点问题。请注意,副本与其原始副本之间没有依赖关系。
答案 1 :(得分:0)
想象一下:
您是库(DLL)的设计者。您必须定义必须执行的库...然后您编写它。许多进程都可以使用这个DLL中的函数,RAM中有一块内存
当您将此库包含到项目中时(例如在c ++中),您必须添加有关此DLL中的函数的一些信息。
第一种选择:
您可以声明库函数的某些接口(然后您的链接器很高兴;))。
例如:__ declspec(dllexport)int my_function(char *);
之后,在程序中完成导出对象的名称(链接器作业;))...但是
这个对象的名称取决于语言,编译器,等等等等
第二种选择:
您可以向库的项目添加链接器的一些信息(文件* .def)。该文件有两个部分:LIBRARY和SECTIONS。 LIBRARY是你的lib的内部名称:
LIBRARY my_lib
在EXPORTS部分是可以从库中导出的符号
EXPORTS
功能1
函数2
功能3
你可以看到,这个函数没有类型,形式参数等。当你包含这个lib时,你没有任何关于函数的信息。
当你这样做(.def文件)并编译你的lib时,你有.dll和.lib文件。第二个文件可用于在执行时间链接库
如果要在此库中检查导出,可以使用“Dependecny Walker”或“dumpbin”:
dumpbin my.dll / exports
接下来,您可以加载该库:
第一个选项:__ declspec(dllimport)int my_function(char *);
或
第二名:HMODULE LoadLibrary(LPCSTR lpszLibName);
结论:使用导出可以创建更多的通用库(但更复杂)
(对不起我非常糟糕的英语:/)