在我的项目结构中有多个可执行文件/目标文件,它们都使用相同的库。有没有办法使它更紧凑?也许是像for循环这样的东西?
set(ALL_LIBS lib1 lib2 lib3) # etc.
add_executable(program1 program1.cpp)
target_link_libraries(program1 PRIVATE ${ALL_LIBS})
add_executable(program2 program2.cpp)
target_link_libraries(program2 PRIVATE ${ALL_LIBS})
add_executable(program3 program3.cpp)
target_link_libraries(program3 PRIVATE ${ALL_LIBS})
add_executable(program4 program4.cpp)
target_link_libraries(program4 PRIVATE ${ALL_LIBS})
我正在寻找一个解决方案,实现类似的东西或比这更干净:
add_executable(program1 program1.cpp)
add_executable(program2 program2.cpp)
add_executable(program3 program3.cpp)
add_executable(program4 program4.cpp)
# somehow get list of target names
foreach(${TARGETS})
# link libraries to each target
target_link_libraries(${TARGET_NAME} PRIVATE ${ALL_LIBS})
endforeach()
2条答案
按热度按时间s4n0splo1#
您可以定义自己的宏或函数,它定义了一个类似于普通
add_executable
的可执行文件,但也将该可执行文件与公共库链接。CMake变量
ARGV
和ARGN
提供了一个完美的方法来将一个函数/宏的参数转发到另一个函数/宏。这允许轻松地创建现有函数的 Package 器,而不需要解析 Package 函数所需的所有参数。例如,虽然上面定义的函数
add_executable_common
不解析除第一个参数之外的参数,但是它仍然可以用于定义STATIC或SHARED库,并且可以用于定义具有多个源的库:v440hwme2#
我找到了一个不错的解决方案来减少行数。我只是创建了一个函数来接受目标名称和文件路径。
然后我就像这样添加目标: