【问题标题】:Cmake - change where the lib and include directories are for an externalproject and proper linkingCmake - 更改 lib 和 include 目录用于外部项目和正确链接的位置
【发布时间】:2015-04-14 04:11:06
【问题描述】:
cmake_minimum_required(VERSION 3.2.1 FATAL_ERROR)
project("soxy")

add_definitions(-std=c99)

include_directories(soxy)

# Includes
include(ExternalProject)

ExternalProject_Add(
    LibUV
    GIT_REPOSITORY "https://github.com/libuv/libuv.git"
    GIT_TAG "v1.4.2"
    CONFIGURE_COMMAND sh <SOURCE_DIR>/autogen.sh && ./configure --prefix=${CMAKE_CURRENT_SOURCE_DIR}
    PATCH_COMMAND ""
    BUILD_COMMAND "make"
    BUILD_IN_SOURCE 1
    PREFIX ${CMAKE_CURRENT_SOURCE_DIR}/build
)

set( SOXY_SRC src/file_utils.c
     src/http_parser.c
     src/http_request.c
     src/path_utils.c
     src/string_utils.c
)

set( SOXY_HDR src/debug.h
     src/file_utils.h
     src/http_client.h
     src/http_parser.h
     src/http_request.h
     src/logger.h
     src/path_utils.h
     src/soxy_constantsh
     src/soxy.h
     src/string_utils.h
)

set( SOXY_BIN src/soxy.c )

add_executable(soxy ${SOXY_BIN})
add_dependencies(soxy LibUV)

项目结构: /soxy /soxy/CMakeLists.txt /soxy/build/

当我构建 makefile 并运行 make 时,外部项目的 lib 和包含最终在 /soxy 中,我希望它们显示在 /soxy/build/ 中,而当它构建我的项目时它不会设置包含权限,使#include &lt;uv.h&gt; 不起作用并且是未解析的头文件包含。

【问题讨论】:

  • 您应该对收到的答案提供反馈

标签: c cmake


【解决方案1】:

您正在使用--prefix=${CMAKE_CURRENT_SOURCE_DIR}。尝试改用CMAKE_CURRENT_BINARY_DIR

【讨论】:

    【解决方案2】:

    嗯,你搞错了几件事。

    • 通常不需要定义头文件列表。
    • 您没有告诉任何地方编译包含在SOXY_SRC 变量中的文件。例如,如果你做了add_executable(soxy ${SOXY_BIN} ${SOXY_SRC}),你会编译它们。
    • add_dependencies 之后,您还需要target_link_libraries
    • 您应该以“源外”构建为目标。也就是说,你不应该拥有像 ${CMAKE_CURRENT_SOURCE_DIR}/build 这样的东西

    所以,请尝试以下操作(我不知道 ExternalProject_Add 命令,所以我只能猜测行为)。像这样修改ExternalProject_Add的两行:

    BUILD_IN_SOURCE 0
    PREFIX ${CMAKE_BINARY_DIR}/LibUV
    

    并添加:

    include_directories(${CMAKE_BINARY_DIR}/LibUV)
    

    你可能还需要

    link_directories(${CMAKE_BINARY_DIR}/LibUV)
    

    理想情况下,LibUV 的 include 目录与库目录不同,看看你的 ExternalProject_Add 有效地做了什么。

    如前所述,您可能需要 target_link_libraries(soxy uv) 或类似名称,具体取决于生成的库名称

    【讨论】:

      猜你喜欢
      • 2017-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-12
      • 2021-08-06
      • 1970-01-01
      • 2017-11-24
      相关资源
      最近更新 更多