使用CMake时出现非标准扩展链接错误

xt0899hw  于 2023-05-07  发布在  其他
关注(0)|答案(2)|浏览(211)

我有一个C++11项目,我有一个CMakeLists.txt,它可以完美地用GCC构建。
我想尝试使用非标准扩展,并将一个 * 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一开始就没有正确地构建它?我该如何着手解决这个问题?

crcmnpdw

crcmnpdw1#

有几件事正在发生。
1.需要set_source_files_properties(${SOURCE_FILES} PROPERTIES LANGUAGE CXX)来确保将源文件添加到项目中。在MSYS Makefiles生成器中,任何无法识别的文件都不会被编译。在Visual Studio中,它只是以文本文件的形式显示在IDE中。
1.在像MSYS Makefiles这样的生成器中,它不会自动添加适当的编译器标志来编译具有非标准扩展名的文件。相比之下,Visual Studio生成器知道如何做到这一点,不需要额外的步骤。
1.以这种方式添加-xc++标志set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -xc++)会破坏一些东西。这是因为在link进程中也会使用这些标志。因此,在链接行中,它将告诉g++将所有对象和归档文件视为c++文件,并将其视为compile文件。

  1. 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}中的文件。
0ejtzxu1

0ejtzxu12#

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

add_definitions("-xc++")

这可以防止我收到的奇怪错误,它可以编译,并有效地链接,没有错误。

相关问题