LINUX.ORG.RU

Ошибка линковки при кросскомпиляции с помощью mingw - multiple definition of ...

 , , ,


0

2

Собираю одну свою толстую тулзу под винду (коллеги попросили) при помощи mingw. В проекте python2.6 (не спрашивайте, так вышло;-(((), swig, С++. Долгими танцами с бубном все скомпилял, но дальше упс - при сборе dll линкер орет multiple definition of … на все заинлайненные функции.

$ i686-w64-mingw32-g++ -v
Using built-in specs.
COLLECT_GCC=i686-w64-mingw32-g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-w64-mingw32/7.3-win32/lto-wrapper
Target: i686-w64-mingw32
Configured with: ../../src/configure --build=x86_64-linux-gnu --prefix=/usr --includedir='/usr/include' --mandir='/usr/share/man' --infodir='/usr/share/info' --sysconfdir=/etc --localstatedir=/var --disable-silent-rules --libdir='/usr/lib/x86_64-linux-gnu' --libexecdir='/usr/lib/x86_64-linux-gnu' --disable-maintainer-mode --disable-dependency-tracking --prefix=/usr --enable-shared --enable-static --disable-multilib --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --libdir=/usr/lib --enable-libstdcxx-time=yes --with-tune=generic --with-headers=/usr/i686-w64-mingw32/include --enable-version-specific-runtime-libs --enable-fully-dynamic-string --enable-libgomp --enable-languages=c,c++,fortran,objc,obj-c++,ada --enable-lto --with-plugin-ld --enable-threads=win32 --program-suffix=-win32 --program-prefix=i686-w64-mingw32- --target=i686-w64-mingw32 --with-as=/usr/bin/i686-w64-mingw32-as --with-ld=/usr/bin/i686-w64-mingw32-ld --enable-libatomic --enable-libstdcxx-filesystem-ts=yes
Thread model: win32
gcc version 7.3-win32 20180312 (GCC) 

собираю как

i686-w64-mingw32-ld -shared -o _name.pyd name_wrap.o src/*.o -L ~/.wine/drive_c/Python26/libs/ -lpython26 
★★★★

Подобную штуку собирал под виндой. Собственного, MSYS MINGW обычная сборка. Вытаскиваем либы ldd. С питоном сложнее, нужно выкорчевать dll из директории винды и подложить/переименовать на python-mingw или как там оно.

Собственно, билд жёстко зависит от версии установленного пайтона соответственно dll.

l4gfcm ★★
()
Последнее исправление: l4gfcm (всего исправлений: 2)
Ответ на: комментарий от peregrine

ЯННП. раньше (лет пять назад) когда я собирал mingw он нормально ел инлайны, как собственно и положено. Че за нафик произошел?!

Хотя конечно ппц, мне Python.h патчить пришлось - он на hypot ругался. Причем 2.7 тоже.

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

То что билд на версию питона завязан это ладно, это норм. Но че за фигатень с инлайновскими функциями?! Без питона он точно так же орет.

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

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

https://stackoverflow.com/questions/34997795/inline-function-multiple-definition

https://stackoverflow.com/questions/39652884/one-definition-rule-multiple-def...

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

О_О. Погодь, всю жисть тела инлайновых функции специально выносились в хидер что бы их собственно компилятор мог заинлайнить при раздельной компиляции. Ананлогичная штука с интацированием шаблонов.

g++ это ест, вижуал студио это ест - что не так? Как тогда вообще раздельная ткомпиляция может работать?!

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

Вот я открываю доку и вижу там инлайновую ф-ю в хидере который инклюдится в два модуля. И чего? У меня ровно то же самое.

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

У меня нет никакого static inline

AntonI ★★★★
() автор топика
Ответ на: комментарий от peregrine
$ cat a.h
#ifndef EXAMPLE_H
#define EXAMPLE_H
// function included in multiple source files must be inline
inline int sum(int a, int b)
{
    return a + b;
}
// variable with external linkage included in multiple source files must be inline
int a();
#endif

$ cat a.cpp
#include "a.h"
int a()
{
    return sum(1, 2);
}

$ cat b.cpp
#include <stdio.h>
#include "a.h"

int main(){
	printf("%i %i\n", sum(5,6), a());
}

это нормально собирается и работает, хоть раздельно хоть вместе, хоть g++ хоть mingw

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

А теперь взгляни на то что у тебя в проекте ещё и сишные портянки есть (питон то в них наверняка завёрнут), а там inline немного другую семантику имеет.

https://stackoverflow.com/questions/2217628/multiple-definition-of-inline-fun...

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

Спасибо. Теперь осталось понять чо с этим делать… Наверное забить:-(

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