Path 为什么可以';从包含反斜杠的响应@文件读取参数时,是否从MSYS find(现有静态)库调用TLD?

Path 为什么可以';从包含反斜杠的响应@文件读取参数时,是否从MSYS find(现有静态)库调用TLD?,path,linker,static-libraries,ld,mingw-w64,Path,Linker,Static Libraries,Ld,Mingw W64,这与中的问题基本相同,-我知道-但我找不到任何解释如何进行故障排除的方法 我正在用一个巨大的链接器命令(通过g++)在MinGW上构建一个项目,它位于MSYS2 shell(git bash.exe)中。该过程失败的原因包括: /z/path/to/../../../../i686-w64-mingw32/bin/ld.exe: cannot find -lssl 我将-Wl,--verbose添加到g++链接器调用(要传递到ld),我可以看到-L/z/path/to/libs/openssl

这与中的问题基本相同,-我知道-但我找不到任何解释如何进行故障排除的方法

我正在用一个巨大的链接器命令(通过
g++
)在MinGW上构建一个项目,它位于MSYS2 shell(
git bash.exe
)中。该过程失败的原因包括:

/z/path/to/../../../../i686-w64-mingw32/bin/ld.exe: cannot find -lssl
我将
-Wl,--verbose
添加到
g++
链接器调用(要传递到
ld
),我可以看到
-L/z/path/to/libs/openssl/lib/mingw-lssl

...
attempt to open /z/path/to/libs/openssl/lib/mingw/libssl.a failed
...
/z/path/to/libs/openssl/lib/mingw/ssl.dll failed
attempt to open /z/path/to/libs/openssl/lib/mingw\libssl.a failed
...
但这很奇怪,因为文件存在

$ file /z/path/to/libs/openssl/lib/mingw/libssl.a
/z/path/to/libs/openssl/lib/mingw/libssl.a: current ar archive
(…它是在同一台机器上用同一个编译器构建的)

奇怪的是,一旦它尝试用正斜杠
../libssl.a
打开,用反斜杠
打开..\libssl.a
——但至少第一条路径在
bash
shell中签出,如上所示

如果我尝试指定
-l:libssl.a
--或者指定
-l/z/path/to/libs/openssl/lib/mingw-Wl,-Bstatic-lssl
--则情况会更糟;然后,所有打开的尝试都带有反斜杠:

...
attempt to open /z/path/to/scripts/other/build/openssl/build/mingw/lib\libssl.a failed
attempt to open /z/path/to/libs/openssl/lib/mingw\libssl.a failed
...
最重要的是,如果我使用
ld
通过命令行手动查找它,就会找到它:

$ ld -L/z/path/to/libs/openssl/lib/mingw -lssl --verbose
attempt to open Z:/path/to/libs/openssl/lib/mingw/libssl.dll.a failed
attempt to open Z:/path/to/libs/openssl/lib/mingw/ssl.dll.a failed
attempt to open Z:/path/to/libs/openssl/lib/mingw/libssl.a succeeded
有人知道为什么会发生这种情况吗?我如何让
ld
最终找到这些库?或者更确切地说,当这些库存在于
ld
试图打开它们的路径中时,我如何排除故障并理解为什么找不到它们


好的,找到了更多的东西-不确定这是否是一个bug;但我的问题是,我实际上是在从一个文件中读取参数(否则我会得到
g++:参数列表太长
)。因此,要模拟:

$ echo " -Wl,--verbose -L/z/path/to/libs/openssl/lib/mingw -lssl -lcrypto " > tmcd3

$ g++ @tcmd3 2>&1 | grep succeeded | grep ssl                                   
# nothing

$ g++ `cat tcmd3` 2>&1 | grep succeeded | grep ssl
attempt to open Z:/path/to/libs/openssl/lib/mingw/libssl.a succeeded
attempt to open Z:/path/to/libs/openssl/lib/mingw/libcrypto.a succeeded

。。。事实证明,如果在命令行上输入了完全相同的参数,那么静态库查找就会成功-但是如果参数是通过符号
@
从文件中读取的,那么静态库查找就会失败?!不幸的是,我不能在我的实际项目中使用,因为即使使用
cat
,我仍然会得到
g++:参数列表太长
。。。那么我该如何解决这个问题呢?

好的,通过更多的实验,我注意到:

  • Unix路径规范-L/z/path/to/libs/openssl/lib/mingw,往往会失败,而如果我们指定相同的路径规范,除了以Windows驱动器号开头,即:
  • -LZ:/path/to/libs/openssl/lib/mingw
    ,然后事情就开始了-同样是从一个参数文件中,在符号处有
    @


我想,由于shell是MSYS2/
git bash.exe
,在shell上输入完整的POSIX路径并没有问题,因为shell将转换它们-但是在文件中,没有任何东西可以转换它们,所以我们必须使用Windows/MingW约定来指定它们…

好的,再做一些实验,我注意到:

  • Unix路径规范-L/z/path/to/libs/openssl/lib/mingw,往往会失败,而如果我们指定相同的路径规范,除了以Windows驱动器号开头,即:
  • -LZ:/path/to/libs/openssl/lib/mingw
    ,然后事情就开始了-同样是从一个参数文件中,在符号处有
    @


我想,由于shell是MSYS2/
git bash.exe
,在shell上输入完整的POSIX路径并没有问题,因为shell将转换它们-但是在文件中,没有任何东西可以转换它们,因此,我们必须使用Windows/MingW约定来指定它们…

当目录在shell中使用时,MSYS对目录有特殊的处理作为参数。这将例如
//blabla
转换为正确的Windows样式路径。这是为了适应不处理
Z:
style目录根的Unix程序

这里您看到的是,MSYS没有对从文件读取的字符串执行这种解释。当你考虑它时,它是非常合乎逻辑的,但正如你亲身经历的那样,有时也很烦人


长话短说:不要将Unix样式的路径放在带有命令参数的文件中。相反,请将它们传递给MSYS2(应该是Git for Windows 2+附带的MSYS)中使用的例如
cygpath-w

MSYS在shell中使用目录时会将其作为参数进行特殊处理。这将例如
//blabla
转换为正确的Windows样式路径。这是为了适应不处理
Z:
style目录根的Unix程序

这里您看到的是,MSYS没有对从文件读取的字符串执行这种解释。当你考虑它时,它是非常合乎逻辑的,但正如你亲身经历的那样,有时也很烦人

长话短说:不要将Unix样式的路径放在带有命令参数的文件中。相反,将它们传递给例如在MSYS2中工作的
cygpath-w
(应该是Git for Windows 2+附带的MSYS)

$ echo " -Wl,--verbose -LZ:/path/to/libs/openssl/lib/mingw -lssl -lcrypto " > tmcd3
$ g++ @tcmd3 2>&1 | grep succeeded | grep ssl
attempt to open Z:/path/to/libs/openssl/lib/mingw/libssl.a succeeded
attempt to open Z:/path/to/libs/openssl/lib/mingw/libcrypto.a succeeded