c++ - 如何告诉 MinGW 链接器不要导出所有符号?

标签 c++ windows dll gcc g++

我正在使用 MinGW 工具链构建一个 Windows 动态库。

为了构建这个库,我静态链接到提供 API 的其他 2 个库,并且我有一个 .def 文件,我在其中编写了我想在我的库中导出的唯一符号。

问题是 GCC 正在导出所有符号,包括我链接到的库中的符号。有没有办法告诉链接器只导出 def 文件中的符号?

我知道有选项 --export-all-symbols 但似乎没有相反的选项。

现在构建脚本的最后一行具有这样的结构:

g++ -shared CXXFLAGS DEFINES INCLUDES -o library.dll library.cpp DEF_FILE \
OBJECT_FILES LIBS -Wl,--enable-stdcall-fixup

编辑:在 docs关于链接器,它说 --export-all-symbols 是默认行为,如果您提供 def 文件,当您不明确使用该选项时,它会被禁用,除非它没有;无论如何,第 3 方库中的符号正在被导出。

编辑:添加选项 --exclude-libs LIBS--exclude-symbols SYMBOLS 不会阻止库中的符号被导出。

最佳答案

不知道为什么没有真正的答案,但这对我有用:

  1. 目标文件的编译:

    g++ -O0 -gdwarf-4 dll\dllmain.cpp -c -o dllmain.o
    
  2. 链接(-Wl,--exclude-all-symbols 很重要):

    g++ -Wl,--enable-auto-import -Wl,--out-implib,libsomelib.a -Wl,--exclude-all-symbols -shared dllmain.o -o somelib.dll
    

然后你选择在你的 DLL 源代码中直接导出哪些函数:

#include <windows.h>

__declspec(dllexport) void someExportedFunction() {
    MessageBox(NULL, "msgbox", "msgbox", MB_OK);
}

void nonExportedFunction() {
    MessageBox(NULL, "notexported", "notexported", MB_OK);
}

验证:

C:\libtest>pedump -E somelib.dll

=== EXPORTS ===

# module "somelib.dll"
# flags=0x0  ts="2014-02-20 08:37:48"  version=0.0  ord_base=1
# nFuncs=1  nNames=1

  ORD ENTRY_VA  NAME
    1     1570  _Z20someExportedFunctionv

(pedump = http://pedump.me )

关于c++ - 如何告诉 MinGW 链接器不要导出所有符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2810118/

相关文章:

c++ - OpenGL SDL LINK 错误 MSVCRT.lib

c++ - 右值的成员访问运算符应该是一个 xvalue 吗?

c++ - Apple 的 Using C++ with Objective-C 文章不见了...谁能给我一篇新文章,或者帮我找到旧文章?

c++ - 为什么成员初始值设定项不能使用括号?

c++ - 递归共享库加载 - 无法打开共享对象文件

c# - C# Web 服务可以调用其他 DLL 代码吗?

c++ - typedef 类型不匹配将其传递给函数

windows - 批处理文件将特定行从一个文本文件复制到另一个文本文件

php - 在 mod_auth_sspi_1.0.4-2.2.2 中禁用登录提示

windows - 在 Windows 中捕获笔记本电脑盖子关闭事件?