Как правильно связать статическую библиотеку внутри подкаталога? - PullRequest
1 голос
/ 27 июня 2019

Я пытаюсь связать статическую библиотеку, созданную мной с использованием CMake, и иметь структуру подкаталогов к ней.Выглядит это так (-> представляет каталог):

Root
| - CMakeLists.txt
| -> First
|    | - CMakeLists.txt
|    | -> Object
|    |    | - object.cpp object.hpp
|    |
| -> Second
|    | - CMakeLists.txt
|    | - secondObject.hpp secondObject.cpp
|    |
| -> Third
|    | - CMakeLists.txt
|    | - thirdObject.hpp thirdObject.cpp 
|    |
| -> Main
     | - CMakeLists.txt
     | - main.cpp

В файле cmake Root:

cmake_minimum_required(VERSION 3.0)
project(Main)

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

include_directories(First)
include_directories(Second)
include_directories(Third)

add_subdirectory(First)
add_subdirectory(Second)
add_subdirectory(Third)
add_subdirectory(Main)

В файле cmake First:

project(First)

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

add_library(First STATIC Object/object.cpp Object/object.hpp)
add_dependencies(First Second Third)

target_link_libraries( First Second Third)

Второе и третье схожи, но второе зависит только от третьего, а третье вообще ни от чего не зависит.Проблема возникает, когда я пытаюсь связать его с файлом cmake моего Main:

project(Main)

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(Main First Second Third)

add_executable(Main main.cpp)
target_link_libraries(Main First Second Third)

Когда я запускаю cmake .. из папки сборки, он пройдет через все довольные и не будет жаловаться.Однако, когда я нажимаю make или Generate for Windows в графическом интерфейсе, я получаю жалобу, что object.hpp: No such file or directory.Я включаю это в main.cpp.Я, очевидно, могу изменить это на #include <Object/object.hpp>, но я чувствую, что это побеждает цель ссылки в библиотеку.(Может быть, это неправильное мышление).

Я также сталкивался с подобными проблемами, когда в других структурах, подобных этой, в файле типа object.cpp мне нужно было бы сделать #include "Object/object.hpp", даже если object.hpp находится в том же каталоге, что и object.cpp,

Как правильно связать проект Main с проектом First, чтобы мне не нужно было #include <Object/object.hpp>?Или это единственный способ сделать это?Или я иду по этому неправильному пути?

1 Ответ

0 голосов
/ 28 июня 2019

Для меня следующее решение моего CMakeLists.txt работоспособно.Я также думаю, что вам нужно вызывать add_project только один раз в каталоге верхнего уровня.

Добавление дополнительных зависимостей кажется излишним, поскольку заполнение CMake вычисляется с помощью target_link_libraries.Я смог запустить CMake и построить проект, но мои файлы, кроме main.cpp, пусты.

Вот мои CMakeLists.txt

First / CMakeLists.txt

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)    
add_library(First STATIC Object/object.cpp Object/object.hpp)    
target_link_libraries( First Second Third)

Second / CMakeLists.txt

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
add_library(Second STATIC secondObject.cpp secondObject.hpp)
target_link_libraries( Second Third)

Third / CMakeLists.txt

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
add_library(Third STATIC thirdObject.cpp thirdObject.hpp)

CMakeLists.txt

cmake_minimum_required(VERSION 3.0)
project(Main)

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

include_directories(First)
include_directories(Second)
include_directories(Third)

add_subdirectory(First)
add_subdirectory(Second)
add_subdirectory(Third)
add_subdirectory(Main)
...