Создание и использование библиотеки stati c с CMake - PullRequest
1 голос
/ 19 марта 2020

Я пытаюсь сначала создать библиотеку stati c, а затем связать ее с исполняемым файлом, используя CMake. Структура моего файла проекта выглядит следующим образом:

├── CMakeLists.txt
├── build
├── lib
│   ├── CMakeLists.txt
│   ├── build
│   ├── include
│   │   └── Point.hpp
│   └── src
│       └── Point.cpp
└── mainApp.cpp

Сначала я собираю библиотеку следующим образом.

cmake_minimum_required(VERSION 2.8.9)
project(CAST3)
set(CMAKE_BUILD_TYPE Release)

include_directories(include)

file(GLOB SOURCES "src/*.cpp")
add_library(CAST3 STATIC ${SOURCES})

Однако, когда я пытаюсь связать библиотеку с моим исполняемым файлом, я получаю ошибку .

Это мой исполняемый файл

#include"Point.hpp"
int main(int argc, char *argv[]){
    Point p = Point(1,2,3);
    return 0;
}

Это мой файл CMake для связи библиотеки с исполняемым файлом.

cmake_minimum_required(VERSION 2.8.9)
project (CAST3)
set ( PROJECT_LINK_LIBS libCAST3.a )
link_directories( ${CMAKE_CURRENT_SOURCE_DIR}/lib/build)
add_executable(libtest mainApp.cpp)
target_link_libraries(libtest ${PROJECT_LINK_LIBS} )

Когда я запускаю, я получаю ошибка

/mainApp.cpp:1:9: fatal error: 'Point.hpp' file not found
#include"Point.hpp"
        ^~~~~~~~~~~
1 error generated.
make[2]: *** [CMakeFiles/libtest.dir/mainApp.cpp.o] Error 1
make[1]: *** [CMakeFiles/libtest.dir/all] Error 2
make: *** [all] Error 2

Чего мне не хватает?

1 Ответ

2 голосов
/ 19 марта 2020

Чего мне не хватает?

Вы пропали без вести target_include_directories(CAST3 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) внутри lib/CMakeLists.txt.

Вы пропали без вести add_subdirectory(lib) из root CMakeLists.txt.

set ( PROJECT_LINK_LIBS libCAST3.a ) и target_link_libraries(libtest ${PROJECT_LINK_LIBS} ) и link_directories( ${CMAKE_CURRENT_SOURCE_DIR}/lib/build) могут быть удалены. Тогда вам не хватает только target_link_libraries(libtest PUBLIC CAST3). Cmake автоматически найдет правильный файл .a и распространит включающие пути с помощью target_link_libraries.

Так что ваш lib/CMakeLists.txt может выглядеть так:

cmake_minimum_required(VERSION 3.0) # I would advise to update
project(CAST3)
include_directories(include)
file(GLOB sources src/*.cpp) # upper case variable names reserved for exported variables by convention
add_library(CAST3 ${sources}) # STATIC by default
target_include_directories(CAST3 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)

И root CMakeLists.txt может выглядеть так:

cmake_minimum_required(VERSION 3.0) # I would advise to update
project(CAST3)
add_subdirectory(lib)
add_executable(libtest mainApp.cpp)
target_link_libraries(libtest CAST3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...