[*nix]Как собрать C-код C++-компилятором или как скомпилиться на AIX ?

356ft85

DEV-С++ выдал тучу ошибок вот такого рода:
Это я так понимаю из за попытки компилировать C на G++.
Как всё же скомпилить эту прогу компилятором G++?
 
  src/glpapi01.c: In function `void create_prob(glp_prob*)':
src/glpapi01.c:72: error: invalid conversion from `void*' to `GLPROW**'

src/glpapi01.c:73: error: invalid conversion from `void*' to `GLPCOL**'
src/glpapi01.c:77: error: invalid conversion from `void*' to `int*'

src/glpapi01.c: In function `glp_prob* glp_create_prob':
src/glpapi01.c:96: error: invalid conversion from `void*' to `glp_prob*'
src/glpapi01.c: In function `void glp_set_prob_name(glp_prob*, const char*)':
src/glpapi01.c:119: error: invalid conversion from `void*' to `glp_tree*'

src/glpapi01.c:135: error: invalid conversion from `void*' to `char*'
src/glpapi01.c: In function `void glp_set_obj_name(glp_prob*, const char*)':
src/glpapi01.c:160: error: invalid conversion from `void*' to `glp_tree*'

src/glpapi01.c:176: error: invalid conversion from `void*' to `char*'
src/glpapi01.c: In function `void glp_set_obj_dir(glp_prob*, int)':
src/glpapi01.c:201: error: invalid conversion from `void*' to `glp_tree*'
src/glpapi01.c: In function `int glp_add_rows(glp_prob*, int)':
src/glpapi01.c:235: error: invalid conversion from `void*' to `glp_tree*'
src/glpapi01.c:252: error: invalid conversion from `void*' to `GLPROW**'
src/glpapi01.c:257: error: invalid conversion from `void*' to `int*'
src/glpapi01.c:262: error: invalid conversion from `void*' to `GLPROW*'

src/glpapi01.c: In function `int glp_add_cols(glp_prob*, int)':
src/glpapi01.c:339: error: invalid conversion from `void*' to `glp_tree*'

src/glpapi01.c:358: error: invalid conversion from `void*' to `GLPCOL**'
src/glpapi01.c:365: error: invalid conversion from `void*' to `GLPCOL*'

src/glpapi01.c: In function `void glp_set_row_name(glp_prob*, int, const char*)':
src/glpapi01.c:410: error: invalid conversion from `void*' to `glp_tree*'

src/glpapi01.c:439: error: invalid conversion from `void*' to `char*'

street_racer

Вставить преобразование типов.
GLPROW** newFlow=(GLPROW**)malloc(...);

356ft85

неее, там еще 20 файлов в проекте итого - около 1000 таких ошибок. надо другой способ

Andbar

C на G++
ты пытаешься компилировать силный код как сиплюсплюсный?

oliver11

Правильный способ - компилировать код на C gcc, а код на C++ - g++.

356ft85

Да, да, я согласен, но надо откомпилить именно на G++.
Вроде ошибка совсем простая - даже подсказали как исправить если таких ошибок всего 10 , но у меня их 1000

oliver11

Беглая пробежка по ману и гуглу не подсказала мне ключика, который бы включал тайное знание g++ об обычаях использования функции malloc.
Остаётся править код. В принципе, g++ выдаёт, в какой строчке вставлять typecast в какой тип. Можно даже скрипт написать.
Если не секрет, а почему именно надо на g++?

ppplva

Добавь флаг -xc :lol:

356ft85

Беглая пробежка по ману и гуглу не подсказала мне ключика, который бы включал тайное знание g++ об обычаях использования функции malloc.Остаётся править код. В принципе, g++ выдаёт, в какой строчке вставлять typecast в какой тип. Можно даже скрипт написать.Если не секрет, а почему именно надо на g++?
вопрос верный =)
фишка в том что этот кусок встраивается в большущую прогу, которая ессно написана уже на CPP

356ft85

Добавь флаг -xc
попробую
апд.
видимо нету эффекта:
 g++.exe -c mainnovij.cpp -o mainnovij.o -I"lib/gcc/mingw32/3.4.2/include"  -I"include/c++/3.4.2/backward"  -I"include/c++/3.4.2/mingw32"  -I"include/c++/3.4.2"  -I"include"   -xc  

In file included from mainnovij.cpp:8:
src/glpapi01.c: In function `void create_prob(glp_prob*)':
src/glpapi01.c:72: error: invalid conversion from `void*' to `GLPROW**'

src/glpapi01.c:73: error: invalid conversion from `void*' to `GLPCOL**'
src/glpapi01.c:77: error: invalid conversion from `void*' to `int*'

milanadiana

фишка в том что этот кусок встраивается в большущую прогу, которая ессно написана уже на CPP
теперь ты еще скажешь, что G++ линкер не жрет объектные файлы от GCC? От f77 жрет, а от GCC не жрет?

kokoc88

фишка в том что этот кусок встраивается в большущую прогу, которая ессно написана уже на CPP
Я не пойму, ты пишешь всю прогу в одном файле что ли? Компилируй Си-шный код Си-шным компилятором, а Си++ компилируй плюсовым. Потом линкуй это всё вместе.

356ft85

ммм, проблема ещё более хитрая =) потом мне все ето надо компилить вообще под MPIXX на IBM компайлере. так что дабы перестраховаться я пихаю все функции в одну прогу C++ и проверяю работоспособность под G++,
 ибо там с линковкой полная жесть, посему меня попросили просто зафигачить всё в одну прогу =)
апд.
еще была такая строка
    glp_tree *tree = lp->tree;
на нее так же ругался
120 D:\Dev-Cpp\src\glpapi01.c invalid conversion from `void*' to `glp_tree*'
заменил на
glp_tree *tree = (glp_tree) lp->tree;
не прокатило =)

milanadiana

главное выкинуть devcpp нахуй. Потому что там с мейк-файлами какая-то жажа. Тебе нужно грамотное составление make-файла, так что ботай autotools. (autoconf, automake, и проч.). Под виндой они работают. Если грамотно составишь аутоконфиги, то будет похуй, чем ты собираешь, будь то mpicc, gcc, icc.

milanadiana

glp_tree *tree = (glp_tree) lp->tree;
Да ты гений, блин. Вот:
glp_tree *tree = (glp_tree*) lp->tree;

oliver11

видимо нету эффекта:
Потому что -xc надо писать до имени исходного файла, а не после.

356ft85

Потому что -xc надо писать до имени исходного файла, а не после.
ща попробую. а что етот флаг вобще значит?

356ft85

Тебе нужно грамотное составление make-файла, так что ботай autotools. (autoconf, automake, и проч.). Под виндой они работают. Если грамотно составишь аутоконфиги, то будет похуй, чем ты собираешь, будь то mpicc, gcc, icc.
сколько ето по времени займёт? не больше ли чем пихнуть всё в одну функцию ?) если нет, то заботаю кончено, тока доступа к IBM машине пока что нету , так что тренируюсь в иммеющемся G++

milanadiana

чувак, не страдай фигней. Паралельный громакс компилится, линкуя объектники на С, ассемблере и фортране. А ты думаешь, что у тебя будут проблемы с линковкой си и си++ объектников!

milanadiana

дело в том, что метод, который ты хочешь юзать - это кривой костыль. Он будет шаманически работать только на одной версии г++ или Гцц (ну или какой-нибудь другой какашкоид возникнет).

356ft85

ну хзхз.. скомспилить библу в объектный код было поручено одному рюхастому челу, он минут 15 ковырялся и сказал что толи на системе нету автомейка то ли что то еще=)
Я подумал что коли он не разобрался , мне скомпилить там в *.o будет еще сложнее.
Я вот думаю если каждый *.C скомпилить там в *.o и потом прилинковать в CPP получится или нет?

356ft85

дело в том, что метод, который ты хочешь юзать - это кривой костыль. Он будет шаманически работать только на одной версии г++ или Гцц (ну или какой-нибудь другой какашкоид возникнет).
почему? я так понял из проги на Сях, получится прога на C++, которая и в др компайлере прокатит
правда поиск в гугле по "c to cpp" ничего не дал, но раз можно написать скрипт мб его кто то уже писал =)

Dasar

что-то вы все фигней страдаете
для включения C в C++ есть стандартная конструкция

extern "C"
{
bla-bla
}

соответственно, если надо целые файлы зафигачить (и header-ы и c-шники то будет так:
my.cpp

extern "C"
{

#include "my_c_header.h"

#include "my_c_body.c"

}

ppplva

extern "C" { int new = 10; void * p; int * p2 = p; }  

Сколько ошибок в этом фрагменте?

Dasar

хз, ботать надо - на C давно ничего не писал

Andbar

Чисто на уровне компилятора - две: new (не ботал стандарт на счёт extern "C", но студия ругается) и typecast. Логически - неинициализированная ссылка.

ppplva

Это я к тому, что extern "C" неспроста называют "linkage specification". Он всего лишь указывает, что имена переменных, функций и типов экспортируются в формате С (то есть без mangling).

Werdna

Да, да, я согласен, но надо откомпилить именно на G++.
Причём надо как воздух!
А потом ты прибежишь с требованием откомпилировать Фортраном?
Правильнее всего тебе дать возможность объяснить откуда такая несусветная неоходимость. И если внятного объяснения не последует снести тред в мусорку.

okis

Это из тех соображений, что на unix-машине, а уж тем более айбиэмовской, должен быть нормальный компилятор языка C?

serega1604

>а уж тем более айбиэмовской, должен быть нормальный компилятор языка C?

356ft85

А потом ты прибежишь с требованием откомпилировать Фортраном?
Правильнее всего тебе дать возможность объяснить откуда такая несусветная неоходимость. И если внятного объяснения не последует снести тред в мусорку.
я ж ясно написал - есть машина IBM на которой точно скомпилится прога C++ , запиханная в один файл. Доступа у меня к машине пока что нету, так что я упражняюсь и пытаюсь запихнуть всё в один фАЙЛик. не получится - буду пытаться таам линковать, но времени буит мало и не особо я профи в тамошних настройках...

Werdna

я ж ясно написал - есть машина IBM на которой точно скомпилится прога C++ , запиханная в один файл.
Знаешь, у тебя написано вообще непонятно что. Ты хочешь тоже непонятно что.
Уточни следующие вещи:
1) какая это машина.
2) какая операционка.
3) какие там есть компиляторы.
4) по возможности поставь там cmake, думаю он там поставится.

Peace123

IBM стандартно поддерживает xlc\xlC компилятор для всех своих машин и такий осей как Linux, AIX, OS390 etc.
Он успешно справится с твоим кодом.
Написание скрипта считаю неразумным, так как вылезет еще какая-то фигня и надо будет снова изобретать велосипед.

356ft85

в папке с библиотекой есть такой вот файлик
на хосте AIX v 5.2, есть компилятор MPICC ..
как можно скомпилить либу ?)
 ## Process this file with automake to produce Makefile.in ##

INCLUDES = -I../include

lib_LTLIBRARIES = libglpk.la

libglpk_la_LDFLAGS = -version-info 18:0:18 \
-export-symbols-regex '^(glp_|_glp_lpx_).*'

libglpk_la_SOURCES = \
glpapi01.c \
glpapi02.c \
glpapi03.c \
glpapi04.c \
glpapi05.c \
glpapi06.c \
glpapi07.c \
glpapi08.c \
glpapi09.c \
glpapi10.c \
glpapi11.c \
glpapi12.c \
glpapi13.c \
glpapi14.c \
glpapi15.c \
glpapi16.c \
glpapi17.c \
glpavl.c \
glpbfd.c \
glpbfx.c \
glpcpx.c \
glpdmp.c \
glpfhv.c \
glpgmp.c \
glphbm.c \
glpini01.c \
glpini02.c \
glpios01.c \
glpios02.c \
glpios03.c \
glpios04.c \
glpios05.c \
glpios06.c \
glpios07.c \
glpios08.c \
glpios09.c \
glpipm.c \
glpipp01.c \
glpipp02.c \
glplib01.c \
glplib02.c \
glplib03.c \
glplib04.c \
glplib05.c \
glplib06.c \
glplib07.c \
glplib08.c \
glplib09.c \
glplib10.c \
glplib11.c \
glplib12.c \
glplpf.c \
glplpp01.c \
glplpp02.c \
glplpx01.c \
glplpx02.c \
glplpx03.c \
glplpx04.c \
glplpx05.c \
glplpx06.c \
glplpx07.c \
glplpx08.c \
glplpx09.c \
glpluf.c \
glplux.c \
glpmat.c \
glpmpl01.c \
glpmpl02.c \
glpmpl03.c \
glpmpl04.c \
glpmpl05.c \
glpmps01.c \
glpmps02.c \
glppds.c \
glpqmd.c \
glprgr.c \
glprng01.c \
glprng02.c \
glpscf.c \
glpscg.c \
glpscl.c \
glpspm.c \
glpspx01.c \
glpspx02.c \
glpsql.c \
glpssx01.c \
glpssx02.c \
glptsp.c

## eof ##

ark21

autoconf
./configure
make
вроде бы, ну и переменные типа CC должны стоять наверное

Peace123

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

356ft85

Сообщение удалил

356ft85

Сообщение удалил

356ft85

В общем если кто сможет скомпилить библу под AIX то вот она,
кстати библиотека вот http://www.nic.funet.fi/pub/gnu/gnu/glpk/glpk-4.33.tar.gz
g++ -o mainnovij 1.cpp -lglpk -L. -maix64
collect2: ./libglpk.a: not a COFF file

Werdna

В общем если кто сможет скомпилить библу под AIX то вот она,
о чем хоть библиотека?
пеши в приват, договоримся, машину с AIX если дашь — хорошо, нет — найду.

ark21

вроде сбилдил уже, пришлось пересобирать libtool/m4/autoconfig/automake и конфиги немного править. тупая ОС-таки, либо просто версия старая стоит...

356ft85

да, спасибо Earl, перепоставил системные утилиты для сборки библиотеки..

Werdna

libtool/m4/autoconfig/automake
\
выкинь нафиг, используй cmake :)

ppplva

К нему уже написали нормальную документацию?

vall

какой-то он не гиковый, выглядит как пропретарная велосипедообразная поделка.
хотя в плане поддержки мастдая и макоси он явно лидер.
Оставить комментарий
Имя или ник:
Комментарий: