我正在使用 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
不会阻止库中的符号被导出。
最佳答案
不知道为什么没有真正的答案,但这对我有用:
目标文件的编译:
g++ -O0 -gdwarf-4 dll\dllmain.cpp -c -o dllmain.o
链接(
-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/