Cmake мультибиблиотечный сценарий - PullRequest
0 голосов
/ 05 октября 2011

Мы бы хотели организовать проект C++ следующим образом:

project/
    lib1/       (first library)
        CMakeList.txt
        src/
            lib1.c
            foo1.h
        build/
        test/       (tests)
            CMakeList.txt
            test1.c
            test2.c
    lib2/       (second library)
        CMakeList.txt
        src/
            CMakeList.txt
            os/              (OS dependent code)
                CMakeList.txt
                win32/
                    xxx.c    (win32 implementation)
                linux/
                    xxx.c    (linux implementation)
            lib2.c
            foo2.h
        build/
    include/    (shared/public headers)
        lib1/
            lib.h    (shared library header included from apps)
        lib2/
            lib.h    (shared library header -"-)

Пожалуйста, как написать эти CMakeLists.txt, когда даже lib2 следует использовать link1 и когда, например, lib2должен быть переносимым (хотя бы Win32, Linux ...)?

Исправление : если некоторые файлы CMakeList.txt не на своих местах, пожалуйста, примите это.Я, наверное, забыл.

1 Ответ

2 голосов
/ 05 октября 2011

Вся философия заключается в том, чтобы начать с центрального CMakeLists.txt для всего вашего проекта.На этом уровне все цели (libs, исполняемые файлы) будут агрегированы, поэтому не будет проблем с подключением, например, из lib1 в lib2.Если lib2 будет ссылаться на lib1, сначала необходимо собрать lib1.

Исходные файлы для конкретной платформы должны быть условно установлены для некоторой переменной.(Если вам нужно установить переменную в подкаталоге и использовать ее в каталоге выше, вы должны установить ее в кэш, используя CACHE FORCE и т. Д. - см. Руководство для set)

Вот как выделать правильно из исходной сборки - как CMake намеревается:

cd project-build
cmake ../project

Наличие отдельных каталогов сборки для библиотеки не очень CMake'ish (если можно так сказать) и, вероятно, потребует некоторых хаков.

project-build/
project/
    CMakeLists.txt (whole project CMakeLists.txt)
    [
        project(MyAwesomeProject)

        include_directories(include) # allow lib1 and lib2 to include lib1/lib.h and lib2/lib.h
        add_subdirectory(lib1) # this adds target lib1
        add_subdirectory(lib2) # this adds target lib2

    ]

    lib1/       (first library)
        CMakeList.txt
        [
            add_library(lib1...)
            add_subdirectory(test)
        ]
        src/
            lib1.c
            foo1.h
        test/       (tests)
            CMakeList.txt
            test1.c
            test2.c
    lib2/       (second library)
        CMakeList.txt
        [
            add_subdirectory(src)
        ]
        src/
            CMakeList.txt
            [
                if(WIN32)
                    set(lib2_os_sources os/win32/xxx.c)
                elsif(LINUX)
                    set(lib2_os_sources os/linux/xxx.c)
                else()
                    message(FATAL_ERROR "Unsupported OS")
                endif()
                add_library(lib2 SHARED lib2.c ${lib2_os_sources})
            ]
            os/              (OS dependent code)
                win32/
                    xxx.c    (win32 implementation)
                linux/
                    xxx.c    (linux implementation)
            lib2.c
            foo2.h
    include/    (shared/public headers)
        lib1/
            lib.h    (shared library header included from apps)
        lib2/
            lib.h    (shared library header -"-)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...