Ошибка & quot; / usr / bin / ld: не удается найти библиотеку: формат файла не распознан & quot; когда приложение создается как часть коллекции продуктов

У меня есть проект QBS, который представляет собой набор подпроектов, включая статические библиотеки, общие библиотеки и приложения Qt GUI. Приложение Qt GUI вызывало у меня проблему в том, что этап связывания завершился неудачно, выдав несколько ошибок «/ usr / bin / ld: not find {library}: Формат файла не распознан» для библиотек, которые были построены ранее в цепочке проектов. Это не делает это для всех библиотек, включая библиотеки с почти идентичными файлами .qbs, которые выдают эту ошибку.

Как ни странно, если я создаю приложение самостоятельно, то есть запускаю qbs из директории проекта приложения, а не на верхнем уровне, он прекрасно работает (при условии, что все зависимые библиотеки существуют в своих установочных каталогах). Основное различие, которое я вижу, состоит в том, что при сборке полного проекта cpp.libraryPath для приложения игнорируются для всех продуктов в проекте, и приложение пытается связываться с файлами lib, созданными в каталоге сборки, при сборке приложения на его собственные cpp.libraryPaths используются по назначению, а файлы в каталоге установки успешно связаны.

Я понятия не имею, почему файлы lib в каталоге установки могут быть связаны, в то время как файлы в каталоге сборки выдают ошибки. Что может быть причиной сбоя ссылки в первую очередь? Кроме того, как я могу исправить конфигурацию своего проекта, чтобы я мог собрать все, вызвав qbs на верхнем уровне. Возможно, я поступаю неправильно?

Вот команда, которую я использую для запуска сборки:

qbs qbs.installRoot:. release

И наглядное представление вопроса:

Poject         <-- calling qbs here throws errors at linking application
|- LibraryOne
|- LibraryTwo
|- Application <-- calling qbs here works if libraries already built

А вот очень упрощенное воспроизведение соответствующих файлов QBS

-- SubOne.qbs and SubTwo --
// These are identical excluding the files

StaticLibrary {
name: // "One" or "Two"files: [/*Files...*/]

Depends {
name: "Qt"submodules: [/*core, etc...*/]
}

Depends { name: "cpp" }

// cpp depends and properties

Group {
fileTagsFilter: product.type
qbs.installDir: "lib"qbs.install: true
}
}

-- App.qbs --

QtGuiApplication {
name: "App"files: [/*Files...*/]

Depends { name: "One" } // I comment out these depends when building the Application on it's own
Depends { name: "Two" }

Depends { name: "cpp" }
cpp.includePaths: ["../One/include","..Two/include"]
cpp.libraryPaths: ["../lib"] // <-- Ignored during full project build
cpp.staticLibraries: ["One","Two"]

Group {
fileTagsFilter: product.type
qbs.installDir: "bin"qbs.install: true
}
}

1

Решение

Никогда не запускайте qbs из подкаталога. Вам следует всегда запустите его в файле проекта верхнего уровня. В вашей корневой директории у вас должен быть такой файл:

// project.qbs
import qbs

Project {
// order doesn't matter here
references: [
"LibraryOne/SubOne.qbs",
"LibraryTwo/SubTwo.qbs",
"Application/App.qbs"]
}

Во-вторых, вы не должны устанавливать cpp.libraryPaths а также cpp.staticLibraries в вашем приложении, поскольку элементы Зависит, которые есть в вашем приложении, уже будут обрабатывать это (никогда не закомментируйте их).

Ваш cpp.includePaths свойства также не должны быть установлены в приложении, вместо этого они должны входить в экспорт элемент в каждой из ваших статических библиотек, например:

StaticLibrary {
...
Export {
Depends { name: "cpp" }
cpp.includePaths: [product.sourceDirectory + "/include"]
}
...
}

Тогда беги qbs -f project.qbs и все должно быть построено правильно.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]