C++ CMAKE_CXX_标志中存在重复的编译标志
我正在尝试使用cmake链接我的项目 我需要找到一个包mypack,它会给我mypack_定义、mypack_标志、mypack_include_目录和mypack_库。这里mypack_标志包含链接mypack的相关标志。我将把mypack_标志添加到CMAKE_CXX_标志 请参阅下面的CMakeLists.txt: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_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})