首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法将外部git CMake项目的输出(静态库)链接到CMake项目

无法将外部git CMake项目的输出(静态库)链接到CMake项目
EN

Stack Overflow用户
提问于 2015-03-27 05:47:37
回答 1查看 892关注 0票数 2

我很难将最近推到Git上的库链接到我的CMake项目中。

我已经命名为库octal (GitHub),并试图将其链接到另一个库bulletframe (GitHub)。这两个项目都是我创造的。

我预料到链接库第一次不能工作,所以我开始只使用octal中的几个源文件。octal的文件夹结构如下:

代码语言:javascript
复制
.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

octal/CMakeLists.txt

代码语言:javascript
复制
#...

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_HOME_DIRECTORY}")

add_subdirectory("src")

octal/src/CMakeLists.txt

代码语言:javascript
复制
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})

octal/src/vector/vector.h

代码语言:javascript
复制
#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后出现的第一个错误。

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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")

目前,我的当前配置无法同时使用Visual Studio 10 2013MinGW Makefiles生成器构建MinGW Makefiles

当我看到编译器每次都出现类似的错误时,我想到了几个问题:

  • 我是不是没有正确地构建静态库(**octal**)?
  • 我是不是没有正确地将它链接到我的项目(**bulletframe**)?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-29 23:10:27

看起来,您正在构建八进制OK,但并没有提供正确的路径到它的源代码(为了使公告框架能够#include它)或它的编译库。

修复包含问题很简单;只需将路径添加到导入库的INTERFACE_INCLUDE_DIRECTORIES属性。然而,修复库的路径要复杂一些。

使用MSVC,八进制库的完整路径为

代码语言:javascript
复制
${OCTAL_SOURCE_DIR}/lib/<build type>/octal.lib

但是,如果<build type>是“调试”、“发布”等,那么对于其他编译器来说,路径将是

代码语言:javascript
复制
${OCTAL_SOURCE_DIR}/lib/liboctal.a

为了解决这个问题,我会做这样的事情:

代码语言:javascript
复制
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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29294112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档