LINUX.ORG.RU

Как использовать g++ для .c файлов

 


0

1

В общем сабж. Пробовал задать при создание проекта в качестве си компилятора g++, но он не смог скомпилировать простейшую прогу (ну симейк я так понимаю тестит компилятор). Как можно это сделать? Иначе придется переписывать мнооооого кода...

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

Там мнооооого чужого кода. Который писался походу в студии и компилировался с++ компилятором. И там траблы с инлайн функциями=)

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

простейшую прогу

artem@tgen /tmp $ cat test.c 
#include <stdio.h>
int main() {
	printf("Hm...");
	return 0;
}
artem@tgen /tmp $ g++ test.c 
artem@tgen /tmp $ ./a.out 
Hm...artem@tgen /tmp $ 

В Си же нет ничего из того, что нет в Си++

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

Я о примере который компилит симейк при проверке компилятором, это он автоматом делает.

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

И инклуды подпихнуть другие поди еще. Хотя можно попробовать.

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

У симейка? Или у меня? У меня вот проблема, привожу аналог. Оригинал не могу по причине, что там дико дофига, да и комерческая тайна.


$cat test2.c
#include "test2.h"


int main()
{
        funct(3);
        funct(4);
        funct(5);
}

$cat test21.c

#include "test2.h"

int ff()
{
        funct(4);
}

$cat test2.h


__inline int funct(int i)
{
        return i;
}


$gcc test2.c test21.c
/tmp/cczYmsQ2.o: In function `funct':
test21.c:(.text+0x0): multiple definition of `funct'
/tmp/cc1JpwZx.o:test2.c:(.text+0x0): first defined here
collect2: ld returned 1 exit status

$g++ test2.c test21.c
$

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

Попробуй в CMakeLists.txt добавить

SET_SOURCE_FILES_PROPERTIES( ${SRC} PROPERTIES LANGUAGE CXX)

где SRC содержит список файлов, он тогда и для .c файлов будет g++ использовать

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

Попробую, а проще нет способа? А то фалов прилично так там. Хотя сейчас попробую скопипастить.

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

У меня был каталог в котором были намешаны и .c и .сpp, я для него делал просто

AUX_SOURCE_DIRECTORY(. SRC)
SET_SOURCE_FILES_PROPERTIES( ${SRC} PROPERTIES LANGUAGE CXX)
ADD_LIBRARY(common ${SRC})

ну и флаги для компилятора можно так жет через set_source_files_properties навесить.

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

g++ -x c? gcc -x c++ для C++ прокатывает точно, думаю сработает и обратное

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

В Си же нет ничего из того, что нет в Си++

зато в С++ есть:

#include <cstdlib>
int main() {
	char* p = malloc( 100 );
}
wota ★★
()
Ответ на: комментарий от Dudraug

multiple definition of `funct'

Ни о чём не говорит? Функция func() объявлена 2 раза: в test2.c и в test21.c из-за инклуда её туда. Есть 2 выхода: либо сделать её static, но тогда будет дублироваться код, либо в заголовочном файле оставить только прототип функции, а реализацию запихнуть в отдельный файл исходников.

А cmake тут вообще ни при чём.

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

А если убрать все inline функции? компилятор же сам скорее всего заоптимизирует. Или продублировать для каждого .c?

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

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

с inline же так нельзя..

Tanger ★★★★★
()
Ответ на: комментарий от Tanger
/* trololo.c */
int main()
{
  int new = 5;
  return 0;
}
$ gcc trololo.c
$ g++ trololo.c
trololo.c: In function ‘int main()’:
trololo.c:3: error: expected unqualified-id before ‘new’
nokachi
()
Ответ на: комментарий от gentoo_root

А cmake тут вообще ни при чём.

cmake при том, что с++ компилятор это нормально обрабатывает. И код разрабатывался _не_мной_ под студией. Переписывать пару десятков инлайн функций я не хочу, пока там с этим кодом и другим проблем хватает.

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

Ок, спасибо, буду пробовать.

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

Переписывать пару десятков инлайн функций я не хочу, пока там с этим кодом и другим проблем хватает.

Достаточно сделать

inline static int foo(int i) {
  return i;
}

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

Кстати да, можно попробовать. Даже не знаю как лучше сделать.

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

Си не является подмножеством C++, возможны программы валидные в Си и невалидные в С++.

encyrtid ★★★★★
()

Я чего-то не понимаю проблемы: cmake же «самостоятельно» выбирает для каждого файла компилятор, исходя из типа файла. Разве нет?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от unC0Rr

Так это же лишний геморрой CmakeLists.txt переписать так хитро, чтобы он пытался сишные файлы g++'сом компилить. И нафига это нужно, не понимаю.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Tanger

с inline же так нельзя..

А, я не заметил inline. И он там какой-то странный. Тогда только static — если она inline, то пофигу.

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

с++ компилятор это нормально обрабатывает.

Правильно, а ошибку выдаёт линкер. Cmake тут таки ни при чём — его задача — создать Makefile, который считает make, который в итоге запустит компилятор и линкер. Последний уже выдаёт ошибку.

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

Да, именно! И я хочу это поведение изменить же. Но уже заменил инлайны, на инлайн статик

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

C++ компилятор даже создает РАБОЧИЙ исполняемый файл, с точки зрения С++ тут все ок. И линкер g++ ошибки НЕ ВЫДАЕТ. А сишный компилятор выдает. Понимаешь? Проблема в том, что я портирую код с винды на линукс, заодно пишу к нему симейк файлы. В винде этот код нормально собирался и работал, тут нет. Проблема в том, что си++ и си по разному относятся к данному коду. Я не пишу этот код, я его портирую, там проблем и так навалом.

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

В Оп сообщение я написал, что при генерации Makefile симейком я указывал g++ вместо сишного компилятора. В результате чего, он мне сказал, что не смог скомпилировать с помощью CC компилятора примитивный пример и выдал ошибку создания проекта.

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

Да, извиняюсь за невнимательность. В таком случае, лучше подменить компилятор для отдельных файлов, как подсказал Vinick

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

В Си же нет ничего из того, что нет в Си++

int class = 0;
DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от Dudraug

студия по-умолчанию .c файлы собирает сишным компилятором. скажи в чем проблема, может решить можно без извращений?

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

там inline должно помочь -D__inline=inline -std=c99

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

Проблему я ж описал выше уже. Решил проблему заменной всех __inline на __inline static

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