У меня возникли проблемы с попыткой связать библиотеку, которую я недавно нажал на Git для моего проекта CMake.Невозможно связать вывод (статическую библиотеку) внешнего проекта CMake проекта CMake с проектом CMake
Я назвал библиотеку octal
(GitHub) и пытаюсь связать его с другой моей библиотеке bulletframe
GitHub(). Оба проекта созданы мной.
Я ожидал, что связывание библиотеки не будет работать в первый раз, поэтому я только начал с нескольких исходных файлов в octal
. Структура папок octal
выглядит следующим образом:
.gitignore
CMakeLists.txt
.git/
build/ # generated project files go here, but right now it's empty
src/
CMakeLists.txt
octal.h # this is empty
octal/
vector/
vector.h
vector.cpp
восьмеричное/CMakeLists.txt
#...
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_HOME_DIRECTORY}")
add_subdirectory("src")
восьмеричное/SRC/CMakeLists.txt
macro(add_include)
set(ALL_INCLUDES ${ALL_INCLUDES} ${ARGV})
endmacro(add_include)
add_include("octal.h")
add_include("octal/vector/vector.cpp" "octal/vector/vector.h")
add_library(${PROJECT_NAME} STATIC ${ALL_INCLUDES})
install(TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY})
восьмеричное/SRC /vector/vector.h
#pragma once
namespace octal
{
class Vector
{
// ...
Vector Add(Vector other);
Vector Subtract(Vector other);
Vector Multiply(Vector other);
Vector Multiply(double x);
Vector Divide(Vector other);
Vector Divide(double x);
// ...
}
}
Эти конфигурации успешны в построении liboctal.a
файл, однако я не уверен, если они связаны с bulletframe
правильно. Есть несколько файлов, которые используют классы от octal
, но это первая ошибка, которую он дает после того, как он пытается скомпилировать первый исходный файл, entity.cpp
:
fatal error: octal/vector/vector.h: No such file or directory
#include "octal/vector/vector.h"
^
compilation terminated.
src\CMakeFiles\bulletframe.dir\build.make:57: recipe for target 'src/CMakeFiles/bulletframe.dir/entity.cpp.obj' failed
mingw32-make.exe[3]: *** [src/CMakeFiles/bulletframe.dir/entity.cpp.obj] Error 1
CMakeFiles\Makefile2:121: recipe for target 'src/CMakeFiles/bulletframe.dir/all' failed
mingw32-make.exe[2]: *** [src/CMakeFiles/bulletframe.dir/all] Error 2
CMakeFiles\Makefile2:133: recipe for target 'src/CMakeFiles/bulletframe.dir/rule' failed
mingw32-make.exe[1]: *** [src/CMakeFiles/bulletframe.dir/rule] Error 2
Makefile:130: recipe for target 'bulletframe' failed
mingw32-make.exe: *** [bulletframe] Error 2
bulletframe
имеет аналогичную структуру папок для octal
bulletframe/CMakeLists.txt:
include(ExternalProject)
set(EXPROJ_DIR "${CMAKE_HOME_DIRECTORY}/external")
set(LIB_DIR "${CMAKE_HOME_DIRECTORY}/lib")
set(OCTAL_NAME "octal-git")
set(OCTAL_GIT "https://github.com/TheOctopod/octal-cpp.git")
set(OCTAL_PREFIX "${EXPROJ_DIR}/${OCTAL_NAME}")
set(OCTAL_SOURCE_DIR "${EXPROJ_DIR}/${OCTAL_NAME}")
set(OCTAL_BUILD_DIR "${EXPROJ_DIR}/${OCTAL_NAME}/build")
set(OCTAL_INSTALL_DIR "${LIB_DIR}")
ExternalProject_Add(${OCTAL_NAME}
PREFIX ${OCTAL_PREFIX}
TMP_DIR ${OCTAL_PREFIX}-tmp
STAMP_DIR ${OCTAL_PREFIX}-stamp
# - Download Step ------------------
GIT_REPOSITORY ${OCTAL_GIT}
# - Update Step --------------------
UPDATE_COMMAND ""
# - Configure Step -----------------
SOURCE_DIR ${OCTAL_SOURCE_DIR}
# - Build Step ---------------------
BINARY_DIR ${OCTAL_BUILD_DIR}
# - Install Step ------------------
INSTALL_COMMAND ""
CMAKE_ARGS
"-DCMAKE_BUILD_TYPE=Release"
)
add_library("octal" STATIC IMPORTED)
set_target_properties("octal" PROPERTIES
# this is where ExternalProject built liboctal.a at
IMPORTED_LOCATION "${OCTAL_BUILD_DIR}/src"
)
add_subdirectory(src)
bulletframe/SRC/CMakeLists.txt
macro(add_include)
set(ALL_INCLUDES ${ALL_INCLUDES} ${ARGV})
endmacro(add_include)
add_include("entity.cpp")
add_library(${PROJECT_NAME} STATIC ${ALL_INCLUDES})
target_link_libraries(${PROJECT_NAME} "octal")
Как можно заметить, мои текущие конфигурации не в состоянии построить bulletframe
с обеих Visual Studio 10 2013
и MinGW Makefiles
генераторов.
пару проблем, приходят на ум, когда я видел компилятор дает подобные ошибки каждый раз:
- Am Я не строит статическую библиотеку (
octal
) правильно? - Я не связываю его с моим проектом (
bulletframe
) правильно?
Смешные вы упомянули заявление, если-- я на самом деле просто добавлена проверка для 'MSVC'. Однако одна вещь, которую я смущает, - это то, почему мне нужно определить исходные файлы «восьмеричные». Недостаточно ли 'octal.lib' или' liboctal.a'? Если бы я мог просто напрямую включить источники, зачем беспокоиться о компиляции библиотеки? В любом случае, спасибо за ответ, и я попробую решение позже. – octopod
Ваше решение сработало - хотя я по-прежнему был бы признателен за некоторые разъяснения по поводу озабоченности, изложенной в предыдущем комментарии. Разве вы предпочли бы, чтобы я задал еще один вопрос? – octopod
Действительно, все, что мы хотим видеть, - это публичные заголовки восьмеричного, а не полного списка источников. См. Например [этот недавний ответ] (http://stackoverflow.com/a/29315458/2556117), в котором содержится мое мнение о том, как структурировать исходные файлы библиотеки. Поскольку общие заголовки восьмеричных находятся на том же пути, что и источники, нам нужно просто указать этот путь. Основное преимущество наличия восьмеричной в качестве автономной библиотеки состоит в том, что ее не нужно компилировать несколько раз, даже если она включена несколькими целями. – Fraser