Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有重复编译标志的CMake生成器表达式_C++_Cmake - Fatal编程技术网

C++ 具有重复编译标志的CMake生成器表达式

C++ 具有重复编译标志的CMake生成器表达式,c++,cmake,C++,Cmake,我正在尝试使用创建依赖于编译器的配置。此配置的一部分是使用include目录列表设置编译器标志,类似于。然而,由于某种原因,在这种情况下,表达式对我来说并不合适。以下是简化的示例: cmake_minimum_required(VERSION 3.6) project(NinjaPlayground) add_executable(NinjaPlayground main.cpp) list(APPEND LIB_INCLUDE_DIRS "${CMAKE_CURRENT_SOURC

我正在尝试使用创建依赖于编译器的配置。此配置的一部分是使用include目录列表设置编译器标志,类似于。然而,由于某种原因,在这种情况下,表达式对我来说并不合适。以下是简化的示例:

cmake_minimum_required(VERSION 3.6)
project(NinjaPlayground)

add_executable(NinjaPlayground main.cpp)
list(APPEND LIB_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/libraryOne/include")
list(APPEND LIB_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/librartTwo/include")

target_compile_options(NinjaPlayground PRIVATE
                        $<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-isystem $<JOIN:${LIB_INCLUDE_DIRS}, -isystem >>
                        $<$<CXX_COMPILER_ID:MSVC>:-experimental:external -external:w -external:I $<JOIN:${LIB_INCLUDE_DIRS}, -external:I >>)
cmake_最低要求(3.6版)
项目(场地)
添加可执行文件(NinjaPlayground main.cpp)
列表(附加LIB_INCLUDE_DIRS“${CMAKE_CURRENT_SOURCE_DIR}/libraryOne/INCLUDE”)
列表(追加LIB_INCLUDE_DIRS“${CMAKE_CURRENT_SOURCE_DIR}/libarttwo/INCLUDE”)
目标编译选项(Ninjapplayland专用
$
$)
如果在UNIX系统中构建,此配置生成的命令如下所示:

/usr/bin/c++ -isystem /home/the-dreams-wind/Documents/Ninja/libraryOne/include /home/the-dreams-wind/Documents/Ninja/librartTwo/include -MD -MT CMakeFiles/NinjaPlayground.dir/main.cpp.o -MF CMakeFiles/NinjaPlayground.dir/main.cpp.o.d -o CMakeFiles/NinjaPlayground.dir/main.cpp.o -c ../main.cpp
/usr/bin/c++ -isystem /home/the-dreams-wind/Documents/Ninja/libraryOne/include -isystem /home/the-dreams-wind/Documents/Ninja/librartTwo/include -MD -MT CMakeFiles/NinjaPlayground.dir/main.cpp.o -MF CMakeFiles/NinjaPlayground.dir/main.cpp.o.d -o CMakeFiles/NinjaPlayground.dir/main.cpp.o -c ../main.cpp
target_compile_options(NinjaPlayground PRIVATE
                        "$<$<NOT:$<CXX_COMPILER_ID:MSVC>>:SHELL:-isystem$<JOIN:${LIB_INCLUDE_DIRS}, -isystem>>"
                        "$<$<CXX_COMPILER_ID:MSVC>:SHELL:-experimental:external -external:w -external:I$<JOIN:${LIB_INCLUDE_DIRS}, -external:I>>")
/usr/bin/c++-isystem/home/thedreams wind/Documents/Ninja/libraryOne/include/home/thedreams wind/Documents/Ninja/librartTwo/include-MD-MT-CMakeFiles/ninjaprayground.dir/main.cpp.o-MF-CMakeFiles/ninjaprayground.dir/o.d-o/CMakeFiles/ninjaprayground.dir.dir/main.cpp
如您所见,列表已展开,但联接表达式忽略了它。我还试图引用以下论点:

target_compile_options(NinjaPlayground PRIVATE
                        "$<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-isystem $<JOIN:${LIB_INCLUDE_DIRS}, -isystem >>"
                        "$<$<CXX_COMPILER_ID:MSVC>:-experimental:external -external:w -external:I $<JOIN:${LIB_INCLUDE_DIRS}, -external:I >>")
target\u compile\u选项(Ninjapplayland专用)
"$"
"$")
它正确连接字符串,但在参数列表中保留引号:

/usr/bin/c++ "-isystem /home/the-dreams-wind/Documents/Ninja/libraryOne/include -isystem /home/the-dreams-wind/Documents/Ninja/librartTwo/include" -MD -MT CMakeFiles/NinjaPlayground.dir/main.cpp.o -MF CMakeFiles/NinjaPlayground.dir/main.cpp.o.d -o CMakeFiles/NinjaPlayground.dir/main.cpp.o -c ../main.cpp
/usr/bin/c++“-isystem/home/thedreams wind/Documents/Ninja/libraryOne/include-isystem/home/thedreams wind/Documents/Ninja/librartTwo/include”-MD-MT-CMakeFiles/NinjaPlayground.dir/main.cpp.o-MF-CMakeFiles/NinjaPlayground.dir.dir/NinjaPlayground.o.d-o-o-o-o-o-c./main.cpp
MSVC也会出现同样的问题。我只是想说清楚,我期待的结果应该是这样的:

/usr/bin/c++ -isystem /home/the-dreams-wind/Documents/Ninja/libraryOne/include /home/the-dreams-wind/Documents/Ninja/librartTwo/include -MD -MT CMakeFiles/NinjaPlayground.dir/main.cpp.o -MF CMakeFiles/NinjaPlayground.dir/main.cpp.o.d -o CMakeFiles/NinjaPlayground.dir/main.cpp.o -c ../main.cpp
/usr/bin/c++ -isystem /home/the-dreams-wind/Documents/Ninja/libraryOne/include -isystem /home/the-dreams-wind/Documents/Ninja/librartTwo/include -MD -MT CMakeFiles/NinjaPlayground.dir/main.cpp.o -MF CMakeFiles/NinjaPlayground.dir/main.cpp.o.d -o CMakeFiles/NinjaPlayground.dir/main.cpp.o -c ../main.cpp
target_compile_options(NinjaPlayground PRIVATE
                        "$<$<NOT:$<CXX_COMPILER_ID:MSVC>>:SHELL:-isystem$<JOIN:${LIB_INCLUDE_DIRS}, -isystem>>"
                        "$<$<CXX_COMPILER_ID:MSVC>:SHELL:-experimental:external -external:w -external:I$<JOIN:${LIB_INCLUDE_DIRS}, -external:I>>")
/usr/bin/c++-isystem/home/the dreams wind/Documents/Ninja/libraryOne/include-isystem/home/the dreams wind/Documents/Ninja/librartTwo/include-MD-MT-CMakeFiles/ninjapplayground.dir/main.cpp.o-MF-CMakeFiles/ninjapplayground.dir/main.cpp.dir/main/main.cpp

我知道我可以在列表上循环并逐个添加选项,但是我想知道我在这里缺少了什么?

在使用它一段时间后,问题最终归结为空间和参数重复数据消除。可以通过删除选项(例如,
-systemi
)及其参数(路径)之间的空格来部分地处理它。但是,有些标志无法避免重复(如
-Xclang
选项)。以抑制重复数据消除。它保留空格,正确解析参数,可以这样使用:

/usr/bin/c++ -isystem /home/the-dreams-wind/Documents/Ninja/libraryOne/include /home/the-dreams-wind/Documents/Ninja/librartTwo/include -MD -MT CMakeFiles/NinjaPlayground.dir/main.cpp.o -MF CMakeFiles/NinjaPlayground.dir/main.cpp.o.d -o CMakeFiles/NinjaPlayground.dir/main.cpp.o -c ../main.cpp
/usr/bin/c++ -isystem /home/the-dreams-wind/Documents/Ninja/libraryOne/include -isystem /home/the-dreams-wind/Documents/Ninja/librartTwo/include -MD -MT CMakeFiles/NinjaPlayground.dir/main.cpp.o -MF CMakeFiles/NinjaPlayground.dir/main.cpp.o.d -o CMakeFiles/NinjaPlayground.dir/main.cpp.o -c ../main.cpp
target_compile_options(NinjaPlayground PRIVATE
                        "$<$<NOT:$<CXX_COMPILER_ID:MSVC>>:SHELL:-isystem$<JOIN:${LIB_INCLUDE_DIRS}, -isystem>>"
                        "$<$<CXX_COMPILER_ID:MSVC>:SHELL:-experimental:external -external:w -external:I$<JOIN:${LIB_INCLUDE_DIRS}, -external:I>>")
target\u compile\u选项(Ninjapplayland专用)
"$"
"$")

根据我最近使用
$
进行的测试,它不适用于显式列表或变量中的列表。这是因为列表“破坏”了正则表达式本身。
$
的用法是处理属性:
-I$
。对于常规列表,请使用命令流。