2015-03-27 7 views
2

У меня возникли проблемы с попыткой связать библиотеку, которую я недавно нажал на Git для моего проекта CMake.Невозможно связать вывод (статическую библиотеку) внешнего проекта CMake проекта CMake с проектом CMake

Я назвал библиотеку octal (GitHub) и пытаюсь связать его с другой моей библиотеке bulletframeGitHub(). Оба проекта созданы мной.

Я ожидал, что связывание библиотеки не будет работать в первый раз, поэтому я только начал с нескольких исходных файлов в 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) правильно?

ответ

1

Похоже, вы строите восьмеричные КИ, но не обеспечиваете надлежащие пути его источники (для bulletframe, чтобы иметь возможность #include его), ни к его скомпилированным библиотекам.

Фиксация вопроса включает в себя простой; просто добавьте путь к свойству INTERFACE_INCLUDE_DIRECTORIES импортированной библиотеки. Однако исправление пути библиотеки немного сложнее.

С MSVC, полный путь к восьмеричной Lib будет

${OCTAL_SOURCE_DIR}/lib/<build type>/octal.lib 

где <build type> является "Debug", "Release" и т.д. Тем не менее, с другими компиляторами, путь будет

${OCTAL_SOURCE_DIR}/lib/liboctal.a 

Чтобы обойти это, я бы что-то вроде:

add_library(octal STATIC IMPORTED) 
if(MSVC) 
    set_target_properties(octal PROPERTIES 
     IMPORTED_LOCATION_DEBUG "${OCTAL_SOURCE_DIR}/lib/Debug/octal.lib" 
     IMPORTED_LOCATION_RELEASE "${OCTAL_SOURCE_DIR}/lib/Release/octal.lib" 
     INTERFACE_INCLUDE_DIRECTORIES "${OCTAL_SOURCE_DIR}/src") 
else() 
    set_target_properties(octal PROPERTIES 
     IMPORTED_LOCATION "${OCTAL_SOURCE_DIR}/lib/liboctal.a" 
     INTERFACE_INCLUDE_DIRECTORIES "${OCTAL_SOURCE_DIR}/src") 
endif() 
+0

Смешные вы упомянули заявление, если-- я на самом деле просто добавлена ​​проверка для 'MSVC'. Однако одна вещь, которую я смущает, - это то, почему мне нужно определить исходные файлы «восьмеричные». Недостаточно ли 'octal.lib' или' liboctal.a'? Если бы я мог просто напрямую включить источники, зачем беспокоиться о компиляции библиотеки? В любом случае, спасибо за ответ, и я попробую решение позже. – octopod

+0

Ваше решение сработало - хотя я по-прежнему был бы признателен за некоторые разъяснения по поводу озабоченности, изложенной в предыдущем комментарии. Разве вы предпочли бы, чтобы я задал еще один вопрос? – octopod

+1

Действительно, все, что мы хотим видеть, - это публичные заголовки восьмеричного, а не полного списка источников. См. Например [этот недавний ответ] (http://stackoverflow.com/a/29315458/2556117), в котором содержится мое мнение о том, как структурировать исходные файлы библиотеки. Поскольку общие заголовки восьмеричных находятся на том же пути, что и источники, нам нужно просто указать этот путь. Основное преимущество наличия восьмеричной в качестве автономной библиотеки состоит в том, что ее не нужно компилировать несколько раз, даже если она включена несколькими целями. – Fraser

Смежные вопросы