Autoconf和Libtool对于静态连接非常顽固

Ale*_*aev 6 autoconf gcc mingw autotools libtool

我正在使用带有POSIX线程的MinGW-w64.我想用POSIX线程和共享库(在本例中为DLL)构建GNU gettext.但是,当构建依赖于具有MinGW/MinGW-w64的POSIX线程的运行时工件(例如DLL或可执行文件)时,最终会依赖于这些工件libwinpthread-1.dll.在我的情况下,我想避免这种情况,并静态地将任何运行时工件链接到POSIX线程!在MinGW/MinGW-w64上唯一能做到这一点的方法是-static在链接阶段提供标志.我之前已经完成了数百次,所以我知道它有效.

现在的问题是我必须处理臭名昭着的Autotools,它们刚刚再次证明它们绝对不灵活,不友好且使用起来很麻烦.我们去吧:

LDFLAGS="-static-libgcc -static-libstdc++ -static" ../configure --build=x86_64-w64-mingw32 --disable-static --enable-shared --disable-java --disable-native-java --enable-relocatable --enable-threads=posix --prefix=<prefix>
Run Code Online (Sandbox Code Playgroud)

你猜怎么着?这个家伙以某种方式解析我已添加的内容-static,它会对我的构建执行以下操作:

  1. 所有应该构建为DLL的GNU gettext库(由于--enable-shared--disable-static)现在都构建为静态库/存档;
  2. 构建所有GNU gettext可执行文件,-static排除使它们依赖的内容libwinpthread-1.dll,例如:

    gcc -pipe -Wall -Wextra -O3 -static-libgcc -static-libstdc++ -o test-lock.exe test-lock.o lock.o threadlib.o -lpthread
    
    Run Code Online (Sandbox Code Playgroud)

    正如我们所看到的,Autotools故意过滤掉了-static我未经许可和任何合理的理由.

我尝试过各种各样的东西,甚至发现:

link_static_flag="-static"
Run Code Online (Sandbox Code Playgroud)

libtool文件中.我试图将其更改为:

link_static_flag=""
Run Code Online (Sandbox Code Playgroud)

希望它会阻止libtool-static旗帜出现时那样作出反应.不幸的是,还没有成功.这令人难以置信地令人沮丧.

好的,Autotools大师,现在终于你的时间闪耀了.