Предположим, ваш каталог выглядит следующим образом:
ANT
-xscommon
--xscommon_config.h
--xscommon_config.cpp
...
Сначала добавьте файл CMakeLists.txt
в xscommon/
:
ANT
-xscommon
--CMakeLists.txt
--xscommon_config.h
--xscommon_config.cpp
...
Теперь в xscommon/CMakeLists.txt
мы создадим библиотеку , который будет импортирован и связан в основном файле CMakeLists.txt:
xscommon / CMakeLists.txt :
#define another target, let's name it 'xscommon'
add_library(xscommon
xscommon_config.h
xscommon_config.cpp
#more sources if you want
)
Теперь в основном файле CMakeLists.txt
:
cmake_minimum_required (VERSION 3.8)
project ("ANT")
#remove this line
#link_directories(${ANT_SOURCE_DIR}/xscommon xscontroller xstypes)
add_executable(
ANT
"ANT.cpp"
"ANT.h"
"quaternionic.h"
"stars.h"
"hashes.h"
)
# add the xscommon directory, this will make the library target defined there available here
add_subdirectory(xscommon)
# link to this directory
target_link_libraries(ANT PRIVATE xscommon)
# use PUBLIC if the xscommon library will be part of the public interface of your
# library. But since it is an executable, PRIVATE is better here.
target_include_directories(ANT PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
Используйте описанный выше метод, вы можете создать больше библиотек и связать их.
Обратите внимание, что не требуется создавать отдельные файлы cmake для каждого подкаталог, но это считается хорошей практикой и модулирует ваш код. Если вы хотите сделать это в основном файле cmake вместо создания подкаталога, добавьте это в основной cmake:
add_library(xscommon
xscommon/xscommon_config.h
xscommon/xscommon_config.cpp
#more sources if you want
)
Обновить в соответствии с рассматриваемыми изменениями
Ваш текущий CMakeLists.txt
:
Эти три строки ниже ничего не делают, определенно не то, что вы думаете. Я знаю, что в команде add_library()
есть слово «добавить», но она не добавляет никаких библиотек, как и add_executable
не добавляет никаких исполняемых файлов. Он создает библиотеку.
add_library(xscommon SHARED IMPORTED)
add_library(xscontroller SHARED IMPORTED)
add_library(xstypes SHARED IMPORTED)
Как создать библиотеку в cmake из двух файлов a.cpp
и a.h
:
add_library(myALib "a.cpp")
Вот и все . Если у вас есть больше источников, вы, конечно, включите их соответственно. В вашем случае вам нужно будет добавить источники xscommon
и другие соответственно.
После того, как вы создали библиотеки, вам нужно связать их с вашим исполняемым файлом. Если вы этого не сделаете, вы получите ошибки undefined reference , потому что компилятор может найти объявления в файлах заголовков, но не определения вашего кода, который существует в файлах .cpp
.
Итак, как ты ссылку? Простой:
target_link_libraries(TARGET_NAME PUBLIC | PRIVATE LIBRARY_NAME)
# TARGET_NAME: can be `executable` or `library`
# PUBLIC or PRIVATE (for exe, it is usually private)
# LIBRARY_NAME: Name of library you want to link to TARGET_NAME
# So if you wanted to link "myALib" which I created above to ANT, you would do:
target_link_libraries(ANT PRIVATE myALib)
# Note: You need to add this line **after** add_executable() because target "ANT" will be created after that. You can do the linking after the "target_include_directories" command.