CMAKE_CXX_FLAGS中的重复编译标志

时间:2016-09-28 22:23:01

标签: c++ cmake openmp

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

我需要找到一个包mypack,它会给我mypack_definitionsmypack_flagsmypack_include_dirsmypack_libraries。这里mypack_flags包含用于链接mypack的相关标志。我会将mypack_flags添加到CMAKE_CXX_FLAGS

请参阅下面的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_flags可能包含-fopenmp,可能包含-fopenmp,当CMAKE_CXX_FLAGS包含-fopenmp时,-fopenmp会有两个set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fopenmp") 。我无法删除

中的mypack_flags
-fopenmp

如果我将其删除,则当-fopenmp不包含-fopenmp时,我将在CMAKE_CXX_FLAGS中没有-fopenmp

有没有办法强制cmake只使用一个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) 吗?谢谢你的建议。

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

感谢RobertPrévost,这是删除重复子串的一般功能:

cleartool mktag -replace \newname \\server\share\path\to\vbs

我们可以通过以下方式调用此函数:

Table 1 - C1, C2 = Main table - C1, C2                  
Table 2 - C1, C2 = Main table - C3, C4           
Table 3 - C1, C2 = Main table - C5, C6          
Table 4 - C1, C2 = Main table - C7, C8

2 个答案:

答案 0 :(得分:3)

有一种方法可以使CMake只包含一个-fopenmpCMAKE_CXX_FLAGS是一个字符串,您可以搜索子字符串。您可以根据是否已在-fopenmp中找到CMAKE_CXX_FLAGS来有条件地添加# 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}) 的所有实例,然后将其重新添加。

{{1}}

答案 1 :(得分:1)

除了cueca解决方案之外,我建议避免使用list(REMOVE_DUPLICATES <list>)CMAKE_CXX_FLAGS命令,而是更喜欢add_*命令:

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

target_*