我正在尝试使用cmake链接我的项目。
我需要找到一个包mypack
,它会给我mypack_definitions
,mypack_flags
,mypack_include_dirs
和mypack_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
答案 0 :(得分:3)
有一种方法可以使CMake只包含一个-fopenmp
。 CMAKE_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_*