LINUX.ORG.RU

кто кривой: я, mingw, g++ или кто-то ещё?


0

0

сорри за ламерство
mingw, GCC 4.4.0, балуюсь с llvm
Не растекаясь мыслью по древу: результат линковки

g++ `llvm-config --libs --cflags core analysis executionengine jit interpreter native --ldflags` fac.o -o fac

зависит от порядка указания библиотек для линковки. Т.е. в вышеуказанном виде ругается на отсутствие одних символов

ac.o:fac.c:(.text+0x36): undefined reference to `LLVMLinkInJIT'
ac.o:fac.c:(.text+0x3b): undefined reference to `LLVMInitializeX86TargetInfo'
...

если раскрыть `llvm-config...` - лезут уже другие ошибки, и только при некотором порядке библиотек в командной строке всё линкуется на ура.

Кто-нибудь знает в чём дело?

Или надо больше информации?

★★★★★

GCC 4.4.0 << обновили бы до 4.4.4 по возможности

если раскрыть `llvm-config...` - лезут уже другие ошибки, и только при некотором порядке библиотек в командной строке всё линкуется на ура.


да, нужно больше информации,
если есть --as-needed флаг, то уберите, или задавайте последовательность линковки

а) обьектные файлы приложения
б) статические библиотеки
в) разные библиотеки
в последнюю очередь в флагах должны перечисляться г) общесистемные библиотеки

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

>да, нужно больше информации

ок, одну команду я уже привёл, вот результат раскрытия llvm-config:

$ llvm-config --libs --cflags --ldflags core analysis executionengine jit interpreter native
-I/mingw/include -D_DEBUG -D__NO_CTYPE_INLINE -D_GNU_SOURCE -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -O2 -fomit-frame-pointer
-L/mingw/lib -ldl -lpsapi -limagehlp -lm
-lLLVMX86Disassembler -lLLVMX86AsmParser -lLLVMX86AsmPrinter -lLLVMX86CodeGen -lLLVMSelectionDAG -lLLVMAsmPrinter -lLLVMMCParser -lLLVMX86Info -lLLVMInterpreter -lLLVMJIT -lLLVMCodeGen -lLLVMScalarOpts -lLLVMInstCombine -lLLVMTransformUtils -lLLVMipa -lLLVMExecutionEngine -lLLVMAnalysis -lLLVMTarget -lLLVMMC -lLLVMCore -lLLVMSupport -lLLVMSystem

при этом уже лезут ошибки

g:/gnu/mingw/lib/libLLVMSystem.a(DynamicLibrary.o):DynamicLibrary.cpp:(.text+0x74e): undefined reference to `_imp__EnumerateLoadedModules@12'
g:/gnu/mingw/lib/libLLVMSystem.a(Signals.o):Signals.cpp:(.text+0x342): undefined reference to `_imp__SymSetOptions@4'
g:/gnu/mingw/lib/libLLVMSystem.a(Signals.o):Signals.cpp:(.text+0x35c): undefined reference to `_imp__SymInitialize@12'

задавайте последовательность линковки


это делает llvm-config. Что, баг вывешивать?

в последнюю очередь в флагах должны перечисляться г) общесистемные библиотеки


вот перенос -limagehlp -lpsapi в конец списка и решил все проблемы

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

>это делает llvm-config. Что, баг вывешивать?

да, не мешало бы, похоже что mingw ведет себя также как и нативный линуксовый gcc/ld с флагом --as-needed

собственные библиотеки llvm должны быть вначале списка, системные - в конце.

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

его исправить нельзя, ибо чтобы понять в каком порядке линковать библиотеки надо уже что-то слинковать

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

>его исправить нельзя, ибо чтобы понять в каком порядке линковать библиотеки надо уже что-то слинковать

в багзилле даже патч лежит, который именно это исправляет

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

Заранее отвечу, что бесполезно. Лучше пропиши в Makefile либы в том порядке в котором линкуется без ошибок.

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

спасибо, но поздняк метаться. Если не поможет - накачу дифф на llvm-config «и будет мне счастье» =)

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

ипать, с 4.5.0 вообще не собралось:

g:/gnu/home/src/llvm/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp: In member function 'void llvm::LiveIntervals::handleVirtualRegisterDef(llvm::MachineBasicBlock*, llvm::MachineBasicBlock::iterator, llvm::SlotIndex, llvm::MachineOperand&, unsigned int, llvm::LiveInterval&)':
g:/gnu/home/src/llvm/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp:300:6: internal compiler error: Segmentation fault

откатываемся на 4.4.0

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

4.5.0 вообще невозможно использовать) если хочется 4.5 ветку, то надо брать то, что сейчас лежит в svn для 4.5.1 , оно уже пригодно, а релизный .0 - ноль он и есть ноль)

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

>т.е. кривой llvm-config? Спасибо...

Т. е. кривые руки у кого-то:

gcc $(LDFLAGS) $(OBJ) $(LIBS)

Библиотеки идут в конце. В случае динамических библиотек неважно, в каком порядке и где их указывать, а в случае статических действует такое правило: в текущей библиотеке ищутся unresolved символы на текущий момент. Соответственно, указываешь библиотеки в начале и они не используются, т. к. нету unresolved symbols, которые нужно брать из них.

Если уж очень хочется, то gcc -Wl,-( `llvm-config....` -Wl,-) ...

The linker will search an archive only once, at the location where it is specified on the command line. If the archive defines a symbol which was undefined in some object which appeared before the archive on the command line, the linker will include the appro- priate file(s) from the archive. However, an undefined symbol in an object appearing later on the command line will not cause the linker to search the archive again.

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

>Если уж очень хочется, то gcc -Wl,-( `llvm-config....` -Wl,-) ...

имхо, проще llvm-config пропатчить, не?

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

>4.5.0 вообще невозможно использовать) если хочется 4.5 ветку, то надо брать то, что сейчас лежит в svn для 4.5.1 , оно уже пригодно, а релизный .0 - ноль он и есть ноль)

собирать самому gcc под mingw? Неее, 4.5 мне на столько не хочется =)

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

>имхо, проще llvm-config пропатчить, не?

А тебе не кажется, что правильнее писать как положено:

$(CC) `llvm-config --cflags --ldflags` $(SRC) `llvm-config --libs`

Библиотеки в конце, цитату из man ld я приводил. Рекомендую посношаться с автотулзами: там в какой-то момент наступаешь на эти грабли и разница между LDFLAGS и LIBS надежно отпечатывается и оседает в мозгу.

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

хм... да, наверное вы правы.
Спасибо

yyk ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.