非标准扩展链接错误CMake

时间:2018-12-21 13:34:42

标签: c++ gcc cmake clion

我有一个C ++ 11项目,为此我有一个与gcc完美结合的CMakeLists.txt。 我想使用非标准扩展名,并将单个Manager.cpp文件(使用mv)更改为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 :(得分:1)

发生了几件事。

    需要
  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}中的文件中。

答案 1 :(得分:0)

因此,关键的更改是添加“ -xc ++”作为定义,而不是CMAKE_CXX_FLAGS的一部分,即

add_definitions("-xc++")

这可以防止我收到奇怪的错误并进行编译,并且可以有效地链接而不会出错。