ошибка связывания нестандартного расширения CMake - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть проект на C ++ 11, для которого у меня есть CMakeLists.txt, который прекрасно собирается с помощью gcc.Я хотел поиграть с нестандартными расширениями и заменил (используя mv) один файл Manager.cpp на Manager.cu.Я пытаюсь скомпилировать проект с помощью gcc.Следующее, помеченное в **, является внесенными изменениями

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 **-xc++**")
set(SOURCE_FILES
        **Manager.cu**
            .......
            .......
)
**set_source_files_properties(${SOURCE_FILES} PROPERTIES LANGUAGE CXX)**
**add_executable(test ${SOURCE_FILES})**
**set_target_properties(test PROPERTIES LINKER_LANGUAGE CXX)**

Когда я пытаюсь собрать это в CLion 2018.2, я вижу, что оно успешно собрано из-за следующего сообщения

[1%] Создание объекта CXX CMakeFiles / test.dir / medyan / src / Manager.cu.o ...

При сборке всех файлов на этапе компоновки я получаю бесконечные ошибки и предупрежденияследующего типа

> ...*.cpp.o error: stray ‘\371’ in program ..*cpp.o: error: stray ‘\34’
> in program ....*.cu.o: error: stray ‘\2’ in program ....*.cu.o:
> warning: null character(s) ignored ..*.cpp.o:3209:629: warning: null
> character(s) ignored ..*.cpp.o:3209:1: error: stray ‘\22’ in program
> ..*.cpp.o:3209:631: warning: null character(s) ignored
> ..*.cpp.o:3209:1: error: stray ‘\24’ in program

Я не могу отладить это, поскольку сообщение об ошибке не помогает.Означает ли это, что cmake не создал его должным образом?Как это исправить?

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Происходит несколько вещей.

  1. set_source_files_properties(${SOURCE_FILES} PROPERTIES LANGUAGE CXX) необходимо, чтобы убедиться, что исходные файлы добавлены в проект.В генераторе MSYS Makefiles любые нераспознанные файлы не являются кандидатами на компиляцию.В Visual Studio он просто отображается в IDE в виде текстового файла.

  2. В таких генераторах, как MSYS Makefiles, он автоматически не добавляет соответствующий флаг компилятора для компиляции файла снестандартное расширение.Напротив, генератор Visual Studio знает, как это сделать, и никаких дополнительных шагов не требуется.

  3. Добавление флага -xc++ таким образом set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -xc++) ломает вещи.Это потому, что эти флаги также используются во время процесса link.Таким образом, в строке ссылки будет указано g++ обрабатывать все объектные и архивные файлы как c++ файлы и compile их.

  4. add_definitions("-xc++") решает эти проблемы, потому чтоон добавляет флаг в строку compile, а не link.

Не используйте add_definitions("-xc++"), вместо этого используйте set_source_files_properties(${SOURCE_FILES} PROPERTIES COMPILE_OPTIONS -xc++).Зачем?Потому что первый способ превращает каждый файл, используемый в любой цели, в файл CMakeLists.txt в c++, что может вызвать проблемы, если файлы c используются в другом месте.Второй способ просто добавляет параметр -xc++ только к файлам в ${SOURCE_FILES}.

0 голосов
/ 24 декабря 2018

Таким образом, ключевым изменением было добавление «-xc ++» в качестве определения, а не как части CMAKE_CXX_FLAGS, т.е.ошибки.

...