Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.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_CXX_标志中存在重复的编译标志_C++_Cmake_Openmp - Fatal编程技术网

C++ CMAKE_CXX_标志中存在重复的编译标志

C++ CMAKE_CXX_标志中存在重复的编译标志,c++,cmake,openmp,C++,Cmake,Openmp,我正在尝试使用cmake链接我的项目 我需要找到一个包mypack,它会给我mypack_定义、mypack_标志、mypack_include_目录和mypack_库。这里mypack_标志包含链接mypack的相关标志。我将把mypack_标志添加到CMAKE_CXX_标志 请参阅下面的CMakeLists.txt: cmake_minimum_required(VERSION 2.8) project(QMCLIB C CXX) set(CMAKE_CXX_FLAGS "${CMAKE_C

我正在尝试使用cmake链接我的项目

我需要找到一个包mypack,它会给我mypack_定义、mypack_标志、mypack_include_目录和mypack_库。这里mypack_标志包含链接mypack的相关标志。我将把mypack_标志添加到CMAKE_CXX_标志

请参阅下面的CMakeLists.txt:

cmake_minimum_required(VERSION 2.8)
project(QMCLIB C CXX)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fopenmp")

find_package(mypack REQUIRED)

add_executable(QMC codeA.cpp codeB.cpp )
add_definitions(${mypack_definitions})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${mypack_flags}")
target_link_libraries(QMC ${mypack_libraries})
target_include_directories(QMC PUBLIC ${mypack_include_dirs})
然而,取决于系统,mypack_标志可能包含或不包含-fopenmp,当它包含-fopenmp时,我的CMAKE_CXX_标志将包含两个-fopenmp。我无法删除-fopenmp in

如果我删除它,当mypack_标志不包含-fopenmp时,我将在CMAKE_CXX_标志中没有-fopenmp

有没有办法强迫cmake只使用一个fopenmp?还是可以吃两杯咖啡?谢谢你的建议

======================================================================

感谢Robert Prévost,这里有一个删除重复子字符串的通用函数:

function(removeDuplicateSubstring stringIn stringOut)
    separate_arguments(stringIn)
    list(REMOVE_DUPLICATES stringIn)
    string(REPLACE ";" " " stringIn "${stringIn}")
    set(${stringOut} "${stringIn}" PARENT_SCOPE)
endfunction()
我们可以通过以下方式调用此函数:

 removeDuplicateSubstring(${CMAKE_CXX_FLAGS} CMAKE_CXX_FLAGS)

有一种方法可以使CMake只包含一个fopenmp。CMAKE_CXX_FLAGS是一个可以搜索子字符串的字符串。您可以根据是否已在CMAKE_CXX_标志中找到-fopenmp,有条件地添加它。假设您小心地没有添加两次,那么您可以使用下面的检查来查看是否需要添加它

# find "-fopenmp"
string(FIND ${CMAKE_CXX_FLAGS} "-fopenmp" FLAG_INDEX)
# check if we found it
if (FLAG_INDEX GREATER 0)
   message(STATUS "WE'VE GOT AT LEAST ONE!")
else()
   message(STATUS "WE'VE GOT NONE; ADD IT!")
   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp")
endif()
为了安全起见,您可以删除-fopenmp的所有实例,然后将其重新添加

# remove all occurrences of "-fopenmp"
string(REPLACE "-fopenmp" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
除了listREMOVE_DUPLICATES解决方案之外,我建议避免使用CMAKE_CXX_标志或add_*命令,而更喜欢使用target_*命令:

; ; . 您的cmake文件可能会变成这样:

cmake_minimum_required(VERSION 2.8)
project(QMCLIB C CXX)

function(removeDuplicateSubstring stringIn stringOut)
    separate_arguments(stringIn)
    list(REMOVE_DUPLICATES stringIn)
    string(REPLACE ";" " " stringIn "${stringIn}")
    set(${stringOut} "${stringIn}" PARENT_SCOPE)
endfunction()

find_package(mypack REQUIRED)

set(mycompile_options -fopenmp ${mypack_flags})

removeDuplicateSubstring(${mycompile_options} mycompile_options)

add_executable(QMC codeA.cpp codeB.cpp )
target_compile_definitions(QMC PUBLIC ${mypack_definitions})
target_compile_options(QMC PUBLIC ${mycompile_options})
target_compile_features(QMC PUBLIC cxx_constexpr)
target_include_directories(QMC PUBLIC ${mypack_include_dirs})
target_link_libraries(QMC ${mypack_libraries})

非常感谢,我写了一个函数,然后是你的想法。它删除字符串中重复的子字符串。
cmake_minimum_required(VERSION 2.8)
project(QMCLIB C CXX)

function(removeDuplicateSubstring stringIn stringOut)
    separate_arguments(stringIn)
    list(REMOVE_DUPLICATES stringIn)
    string(REPLACE ";" " " stringIn "${stringIn}")
    set(${stringOut} "${stringIn}" PARENT_SCOPE)
endfunction()

find_package(mypack REQUIRED)

set(mycompile_options -fopenmp ${mypack_flags})

removeDuplicateSubstring(${mycompile_options} mycompile_options)

add_executable(QMC codeA.cpp codeB.cpp )
target_compile_definitions(QMC PUBLIC ${mypack_definitions})
target_compile_options(QMC PUBLIC ${mycompile_options})
target_compile_features(QMC PUBLIC cxx_constexpr)
target_include_directories(QMC PUBLIC ${mypack_include_dirs})
target_link_libraries(QMC ${mypack_libraries})