LINUX.ORG.RU

кросс сборка sqlite3 для статической линковки

 , ,


0

1

Не правильно я вопрос задавал раньше. Мне ведь ехать, а не шашечки.

Я давно использую fedora для сборки некоторых библиотек, для использования на оффтопике. Потому что mingw порой фейлится, когда особа наглая библиотека начинает требовать для своей сборки python или ещё что. На linux Это делать проще.

Но вот сейчас я захотел собрать sqlite3 в виде объектного файла, чтобы встроить его в exe'шник. Я собираю амальгамированные исходники

i686-w64-mingw32-gcc -c sqlite3.c

получаю объектный файл, но слинковать его не могу, там кучи неразрешённых зависимостей. В основном на WinAPI. Я могу разрешить эти зависимости, если использую линковщик для объединения этого файла с библиотеками из mingw

i686-w64-mingw32-ld -o res.o sqlite3.o /usr/i686-w64-mingw32/sys-root/mingw/lib/libkernel32.a

Это помогает, но возникает неразрешённая зависимость lib32_libkernel32_a_iname. Но dll-то собрать получается. Т.е. компилятор и линкер как-то разрешают это всё. Т.е. мне чего-то просто незватает?

★★★★★
Ответ на: комментарий от SZT

Не помогает. -l вообще ставить бессмысленно. С ключём -c gcc пропускает стадию линковки. По этому я вызываю линкер вручную.

atrus ★★★★★
() автор топика

там кучи неразрешённых зависимостей.

каких именно?

Harald ★★★★★
()

а зачем ты вообще линкер явно вызываешь, у тебя конечная цель какая, слинковать sqlite3 со своим приложением или статическую библиотеку сделать?

в первом случае вызываешь gcc с указанием объектного файла sqlite3, во втором ar и ranlib

Harald ★★★★★
()
Ответ на: комментарий от Harald

каких именно?

WinAPI, ну, типа, CreateFileA.

а зачем ты вообще линкер явно вызываешь, у тебя конечная цель какая

Конечная цель у меня получить .o файл. Который потом будет линковаться уже не binutils и не на linux. :)

atrus ★★★★★
() автор топика

Так, кажется проблема почти разрешилась. ld надо скормить

--disable-runtime-pseudo-reloc и --disable-auto-import

atrus ★★★★★
() автор топика
Ответ на: комментарий от atrus

тогда вообще не надо пытаться ему зависимости указывать, они указываются при окончательной линковке .exe файла

Harald ★★★★★
()
Ответ на: комментарий от atrus

А отчего у тебя оно там не линкуется вообще? Вот эти вот lib32_libkernel32_a_iname это интринсики https://msdn.microsoft.com/en-us/library/hh977023.aspx отсюда Взять например lib32_libkernel32_a-cpuid.o:

#include <intrin.h>
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>


int __cdecl start(int argc, char **argv)
{
  printf("test\n");
  int cpuInfo[4];
  __cpuid(cpuInfo, 0);
  printf("%i %i %i %i\n", cpuInfo[0], cpuInfo[1], cpuInfo[2], cpuInfo[3]);
  return 0;
}

Скомпилять в запускаемый exe можно так

i686-w64-mingw32-gcc -O2 -std=c99 shindows.c -nostdlib -c
i686-w64-mingw32-ld shindows.o -o shindows.exe -s --subsystem console /usr/i686-w64-mingw32/lib/libmsvcr100.a /usr/i686-w64-mingw32/lib/libuser32.a /usr/i686-w64-mingw32/lib/libkernel32.a /usr/i686-w64-mingw32/lib/libmsvcrt.a

И потом можешь эту штуку запускать в вайне

SZT ★★★★★
()
Ответ на: комментарий от atrus

Таким макаром ты можешь и плюсовый код компилировать и линковать

SZT ★★★★★
()
Последнее исправление: SZT (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.