Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual c++ 可执行文件正在导出符号,但不会被导出,因为它们未被可执行文件本身引用_Visual C++_Gcc_Shared Libraries_Clang_Dllexport - Fatal编程技术网

Visual c++ 可执行文件正在导出符号,但不会被导出,因为它们未被可执行文件本身引用

Visual c++ 可执行文件正在导出符号,但不会被导出,因为它们未被可执行文件本身引用,visual-c++,gcc,shared-libraries,clang,dllexport,Visual C++,Gcc,Shared Libraries,Clang,Dllexport,我有一个特殊的用例,可执行文件需要导出某些符号,这些符号由动态加载的DLL导入并由可执行文件在运行时加载 可执行文件链接到一些静态库,这些静态库实际上包含导出的符号,而DLL使用这些静态库头来导入这些符号 如果这些符号未在可执行文件中使用或未被引用,则链接器将删除它们,因此它们不会被导出,因此在加载时不可用于DLL 我分别使用--whole archive和-force_load选项在GCC/clang上解决了这个问题 windows上的MSVC呢?我使用u declspec(dllexport

我有一个特殊的用例,可执行文件需要导出某些符号,这些符号由动态加载的DLL导入并由可执行文件在运行时加载

可执行文件链接到一些静态库,这些静态库实际上包含导出的符号,而DLL使用这些静态库头来导入这些符号

如果这些符号未在可执行文件中使用或未被引用,则链接器将删除它们,因此它们不会被导出,因此在加载时不可用于DLL

我分别使用--whole archive和-force_load选项在GCC/clang上解决了这个问题

windows上的MSVC呢?我使用u declspec(dllexport)和u declspec(dllimport)在windows上导出和导入符号

编辑:
有关代码参考,您可以在此处找到代码:


这个问题与这些帖子类似,但是这些帖子的答案没有帮助我找到解决方案,或者我觉得它们没有用。

dumpbin/exports{dll}是否正确显示了导出?也许您应该尝试dumpbin/exports{import lib}

根据到目前为止的信息,我猜问题不在于没有导出符号,而在于构建顺序。如果链接dll时出现“未解析外部”,则似乎希望链接器在链接dll时解析exe导出的符号,但exe尚未生成。(您可能将其连接到引用dll,因此它仅在链接dll后生成)


一种方法是让dll LoadLibrary为exe和GetProcAddress指定所需函数的地址,但这确实是一种人为的方法来实现您所追求的目标。如果这些符号是在静态库中定义的,为什么不同时使用exe和dll链接呢?

dumpbin/exports{dll}是否正确显示导出?也许您应该尝试dumpbin/exports{import lib}

根据到目前为止的信息,我猜问题不在于没有导出符号,而在于构建顺序。如果链接dll时出现“未解析外部”,则似乎希望链接器在链接dll时解析exe导出的符号,但exe尚未生成。(您可能将其连接到引用dll,因此它仅在链接dll后生成)


一种方法是让dll LoadLibrary为exe和GetProcAddress指定所需函数的地址,但这确实是一种人为的方法来实现您所追求的目标。如果这些符号是在静态库中定义的,为什么不同时使用exe和dll链接呢?

问题:在windows上,静态库中包含一个OBJ文件,该文件的函数标记为u decl-spec(dll­export),但如果exe中没有使用相同的函数,则无法从exe中导出函数。在其他平台上,我们也有同样的问题,但我们有编译器选项,比如--whole archive/-force_load,do make it work

链接:

我想到的唯一解决方案是不创建静态lib,而是在可执行文件中包含所有代码(静态lib),然后: 1.它在Windows上工作 2.它在Linux上工作,不需要整个归档 3.它在MacOSX上工作,无需强制加载 4.我们也不必担心2和3是否包含死代码、exe膨胀等


这是唯一的解决方案,直到链接器变得智能并扔掉所有未使用的符号,除了那些专门为外部使用而标记的符号,即标记为要导出的符号。

问题:在windows上,静态库包含一个OBJ文件,该文件具有一个标记为u decl-spec(dll导出)的函数但如果在EXE中没有使用相同的函数,则不会从EXE导出函数。在其他平台上,我们也有同样的问题,但我们有编译器选项,比如--whole archive/-force_load,do make it work

链接:

我想到的唯一解决方案是不创建静态lib,而是在可执行文件中包含所有代码(静态lib),然后: 1.它在Windows上工作 2.它在Linux上工作,不需要整个归档 3.它在MacOSX上工作,无需强制加载 4.我们也不必担心2和3是否包含死代码、exe膨胀等


这是唯一的解决方案,直到链接器变得智能并扔掉所有未使用的符号,除了那些专门为外部消费而标记的符号,即标记为要导出的符号。

在可执行文件中用_declspec(dllexport)装饰符号将禁止对其进行优化。到底是什么让你说它没有出口?你如何从DLL中使用它?嗯,不,这在MSVC上很好用。_u_declspec(dllexport)确保函数从EXE导出,并且链接器生成导入库。然后必须构建DLL,声明导出的函数没有_declspec(dllimport),只是原型。它必须链接EXE的导入库。这是一种非常丑陋和脆弱的方法,插件应该使用接口。主机可以通过向插件初始化函数传递接口指针来公开其服务。dumpbin/EXPORTS不显示符号。即使是加载时的动态库也会抱怨找不到符号。相反,在编译动态库时,它们会抱怨未解析的符号,因为可执行导入库也没有这些符号。在可执行文件中用_declspec(dllexport)装饰符号会禁止对其进行优化。到底是什么让你说它没有出口?你如何从DLL中使用它?嗯,不,这在MSVC上很好用。_u_declspec(dllexport)确保函数从EXE导出,并且链接器生成导入库。然后必须构建DLL,声明导出的函数没有_declspec(dllimport),只是原型。它必须链接EXE的导入库。这是一种非常丑陋和脆弱的方法,插件应该