我正在使用MinGW(GCC 4.5.0)编译我的库以作为共享库导出。我这样做是通过使用MAKE命令编译所有源文件,类似于:
gcc -shared -c mysource.cpp -o mysource.o
最后:
gcc -shared -lstdc++ -lm -lws2_32 mysource.o -o mylib.dll
当我对输出文件进行依赖性遍历时(例如使用http://www.dependencywalker.com/),我发现有3个依赖项:
KERNEL32.dll
MSVCRT.dll
LIBSTDC++-6.DLL
让我的DLL依赖于不附带Windows的文件对于我的最终目标来说是次优的。
有没有办法设置我的系统,以便最终输出(DLL) ONLY 取决于 KERNEL32 和 MSVCRT ?< / p>
答案 0 :(得分:7)
-static
标志可能正是您要找的。 (在同一行上同时使用-static
和-shared
对我来说仍然很有趣,但它们不是对立的。)
如果您使用g++
作为驱动程序而不是gcc
,则可以使用-static-libstdc++
标记。
答案 1 :(得分:1)
嗯,这正是你告诉你的链接器使用-lstdc++
做的...也许在<{em> -shared
之前移动该参数并再次链接。据我所知,应该使用C ++标准库的静态版本。
注意:我认为有一个很好的理由更喜欢g ++用于C ++目标而不是使用gcc。可能是关于包含C ++标准库。不记得它从我的头顶。此外,我不知道MinGW在这种情况下是否有所不同。
答案 2 :(得分:0)
我相信正确的答案是“否”。回答此问题的其他人尚未尝试解决您的问题。我很高兴向我展示我的错,但是我对此进行了详尽的研究,至少MINGW
和CYGWIN
环境似乎都需要使用Windows特定的动态链接库(dll)进行分发。
对于Cygwin64,我使用带有以下标志的“ g ++”进行编译:
FFLAGS = -g -Wunused-variable -static -static-libgcc -static-libstdc++
,但是可执行文件仍然需要使用"cygwin1.dll"
进行分发-我非常同意这是次优的,并且我不了解该限制。我在MINGW
中发现了类似的问题。