帮助理解Makefile.in中的EXPORTS

时间:2010-04-18 07:20:24

标签: makefile

在linux(ubuntu)上的现有c ++项目的Makefile.in中,它有:

EXPORTS     = \
        gtkmozembed.h \
        gtkmozembed_glue.cpp \
        gtkmozembed_internal.h

请告诉我EXPORTS的含义是什么?

谢谢。

2 个答案:

答案 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);

结论:使用导出可以创建更多的通用库(但更复杂)

(对不起我非常糟糕的英语:/)