我已经完成了将一个可用的Visual Studio构建移植到Linux上的gcc的任务。
该解决方案有60多个项目。要链接最终的exe需要许多静态库,一些由解决方案构建,一些外部库。
我已经了解了为什么命令对gcc很重要(我的基本理解是,基本上你需要对它们进行排序,以便在提供它们的lib之前列出需要功能的lib。)
VS并不关心libs在命令行中出现的顺序,因此我没有继承有意义的libs出现的顺序。
由于涉及查找正确顺序的库的数量似乎是一项相当大的任务,当前正确的顺序可能会被后来的更改打破,而且在库中可能存在循环引用。所有这些都导致我在libs周围使用start-group和end-group。
但是我发现包括组中的所有库都没有解析,但是从组中排除了一些lib并在结束组之后列出它们会链接。
那是
-start-group lSomelibA lSomelibB ... lSomelibX lSomelibY lSomelibZ-end-group
因未解决的符号而失败。
-start-group -lSomelibA -lSomelibB ... -lSomelibX end-group -lSomelibY -lSomelibZ
工作
-start-group lSomelibA lSomelibB ... lSomelibX lSomelibY lSomelibZ-end-group lSomelibY lSomelibZ
重复那些lib也有效。
我已经阅读了关于开始/结束组的内容,但无法理解为什么包含所有库可能会失败。
为什么在包含lib失败后将lib留在组外?
未解决的符号错误引用GLIBCXX包含版本号,确切的消息随着重新排序lib而改变。我猜测某些内容可能不止一次被定义。