2016-07-09 3 views
0

Я пытаюсь улучшить свой макет проекта.Как создать зависимости в CMake?

Вот (некоторые) мой CMakeLists.txt

project(Numerical CXX) 

include(cotire) 

cmake_minimum_required(VERSION 3.1) 

set (CMAKE_CXX_STANDARD 14) 

add_executable(hw1 hw1.cpp 
    linalg/lu.cpp 
    linalg/banded.cpp 
) 

add_executable(hw2 hw2.cpp 
    linalg/cholesky.cpp 
    linalg/lu.cpp 
    linalg/banded.cpp 
) 

add_executable(hw3 hw3.cpp 
    linalg/solvers-new.cpp 
    linalg/cholesky.cpp 
    linalg/lu.cpp 
    linalg/banded.cpp 
) 
... 

lu.h включает , поэтому все, что нужно lu также потребуется banded. Это требует избыточности в моем проекте, как показано выше. Есть ли способ, который мне не нужно добавлять banded.cpp каждый раз, когда я добавляю lu.cpp?

+0

Почему бы не сократить время компиляции и сделать их библиотеку? – kfsone

+0

@kfsone: это похоже на то, что я хотел бы сделать! Как я могу это сделать? –

ответ

1

@ ответов работы Amadeus, но я думаю, что лучше ответ взять общие файлы и переместить их в библиотеку:

project(Numerical CXX) 
include(cotire) 
cmake_minimum_required(VERSION 3.1) 
set (CMAKE_CXX_STANDARD 14) 

add_library(CommonLib STATIC 
    linalg/lu.cpp 
    linalg/banded.cpp 
) 

add_executable(hw1 
    hw1.cpp 
) 

target_link_libraries(hw1 LINK_PUBLIC 
    CommonLib 
) 

add_executable(hw2 
    hw2.cpp 
    linalg/cholesky.cpp 
) 

target_link_libraries(hw2 LINK_PUBLIC 
    CommonLib 
) 

add_executable(hw3 
    hw3.cpp 
    linalg/solvers-new.cpp 
    linalg/cholesky.cpp 
) 

target_link_libraries(hw3 LINK_PUBLIC 
    CommonLib 
) 
+0

Как я могу решить, что входит в библиотеку? –

+2

@krey Независимо от того, что вы обычно используете повторно среди всех своих модулей, нет причин, по которым вы не можете просто поместить все, что вы собираетесь использовать под ним. Процесс связывания будет извлекать только необходимые функции в результирующий двоичный файл. – kfsone