У меня возникли проблемы с использованием Gradle с C ++. В частности, я собираю спецификацию нативной библиотеки в одном проекте, который использует win32 и opengl, и пытается ссылаться на эту статическую библиотеку из другого исполняемого тестового проекта.
Настройки библиотеки gradle.build:
repositories {
libs(PrebuiltLibraries) {
//defines the windows pre-built library, headers and .lib files
windowsSDK {
headers.srcDirs srcWindowsSDKDirName
binaries.withType(PrebuiltStaticLibraryBinary) {
staticLibraryFile = file(srcWindowsSDKLibName+"10.0.16299.0/"+"um/"+"x86/"+"User32.Lib")
binaries.withType(SharedLibraryBinary) {
sharedLibraryLinkFile = file(srcWindowsSDKLibName+"10.0.16299.0/"+"um/"+"x86/"+"User32.Lib")
}
}
}
windowsSDKGLU {
headers.srcDir srcWindowsSDKDirName
binaries.withType(PrebuiltStaticLibraryBinary) {
staticLibraryFile = file(srcWindowsSDKLibName+"10.0.16299.0/"+"um/"+"x86/"+"GlU32.Lib")
}
binaries.withType(SharedLibraryBinary) {
sharedLibraryLinkFile = file(srcWindowsSDKLibName+"10.0.16299.0/"+"um/"+"x86/"+"GlU32.Lib")
}
}
windowsSDKGL {
headers.srcDir srcWindowsSDKDirName
binaries.withType(PrebuiltStaticLibraryBinary) {
staticLibraryFile = file(srcWindowsSDKLibName+"10.0.16299.0/"+"um/"+"x86/"+"OpenGL32.Lib")
}
binaries.withType(SharedLibraryBinary) {
sharedLibraryLinkFile = file(srcWindowsSDKLibName+"10.0.16299.0/"+"um/"+"x86/"+"OpenGL32.Lib")
}
}
windowsSDKGDI {
headers.srcDir srcWindowsSDKDirName
binaries.withType(PrebuiltStaticLibraryBinary) {
staticLibraryFile = file(srcWindowsSDKLibName+"10.0.16299.0/"+"um/"+"x86/"+"GDI32.lib")
}
binaries.withType(SharedLibraryBinary) {
sharedLibraryLinkFile = file(srcWindowsSDKLibName+"10.0.16299.0/"+"um/"+"x86/"+"GDI32.lib")
}
}
}
}
Это библиотеки, которые использует nativelibraryspec, и этот библиотечный проект на самом деле прекрасно работает и выдает .lib и .dll.
Из NativeExecutableSpec (мой тестовый проект) я пытаюсь сначала включить весь проект:
lib project: ':mylibrary', linkage: "static", library: 'main'
Кажется, это работает с точки зрения включения самой библиотеки — она находит .lib или .dll. Однако это приводит к ошибкам ссылки:
main.lib(minimal.obj) : error LNK2019: unresolved external symbol __imp__ChoosePixelFormat@8 referenced in function "public: int __thiscall
и многое другое ……
Чтобы попробовать и проверить это вручную, я ссылался на статическую библиотеку вручную таким же образом, я включил файлы win32.lib и включил ее в проект следующим образом:
repositories {
libs(PrebuiltLibraries) {
//defines the windows pre-built library, headers and .lib files
mySDK {
headers.srcDirs "mysdk/Shared/headers"binaries.withType(PrebuiltStaticLibraryBinary) {
staticLibraryFile = file("mysdk/build/libs/main/static/main.lib")
binaries.withType(SharedLibraryBinary) {
sharedLibraryLinkFile = file("mysdk/build/libs/main/static/main.lib")
}
}
}
}
}
и включил эти библиотеки в тест NativeExecutableSpec.
lib library: "mySDK", linkage: "static"
Оба метода попытки связать статическую библиотеку, которая ссылается на эти библиотеки Windows, похоже, вызывают ошибки связи, и я не уверен, почему … сама библиотека, как я упоминал, компилируется, однако исполняемый файл теста не может связать, так как он не может наследовать ссылочные библиотеки этот проект.
Я исследовал возможные причины, но до сих пор не могу найти разумного объяснения, почему библиотека компилируется, а что-либо, ссылающееся на библиотеку этой библиотеки, — нет.
Любая помощь будет оценена.
Задача ещё не решена.
Других решений пока нет …