【问题标题】:Fuse API and CMake BuildFuse API 和 CMake 构建
【发布时间】:2015-09-12 15:24:48
【问题描述】:

我最近重新打开了我几年前参与的一个项目。我写了一个小python脚本来构建项目。我想将其移植到 CMake。

我遇到的问题是脚本在 linux 上使用pkg-config 来查找保险丝头和库。我无法将它移植到 CMake。

这是当前的 python 脚本

import subprocess, sys, os, shutil

def call( command ):

  c = subprocess.Popen( command.split(), stdout=subprocess.PIPE )
  c.wait()
  return c.stdout.read()

class GCC:

  args = None

  def __init__( self, initial_args ):

    self.args = initial_args

  def addPKG( self, package ):

    self.args.extend( package )

  def addFile( self, name ):

    self.args.append( name )

  def compile( self, out_name ):

    self.args.extend(["-o", out_name])
    print " ".join( self.args )
    gcc = subprocess.Popen( self.args )
    return gcc.wait() == 0


if __name__ == '__main__':

  cflags = call("pkg-config fuse --libs --cflags").split()

  print cflags

  gcc = GCC(["gcc","-g","-Wall","-pg"])
  gcc.addFile("argsparse.c")
  gcc.addFile("hidden.c")
  #gcc.addFile("fs.c")
  gcc.addFile("initialization.c")
  gcc.addFile("resolve.c")
  gcc.addFile("utilities.c")
  gcc.addFile("winhomefs0.4.c")
  gcc.addPKG(cflags)
  gcc.addFile("-lulockmgr")

  if gcc.compile("winhomefs") and 'install' in sys.argv:
    if os.getuid() == 0:
      shutil.copy("winhomefs", "/usr/local/bin/winhomefs")

这是我当前的 CMakeLists.txt 文件。

cmake_minimum_required (VERSION 2.8.11)
project (HomeFS)

set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
    "${CMAKE_SOURCE_DIR}/CMakeModules/")

find_package(FUSE REQUIRED)

add_library(argsparse argsparse.c)
add_library(hidden hidden.c)
add_library(initialization initialization.c)
add_library(resolve resolve.c)
add_library(utilities utilities.c)

add_executable(homefs winhomefs0.4.c)

我遇到的问题是查找保险丝部分。我已经尝试了几种不同的排列方式,包括以下...

https://github.com/tarruda/encfs/blob/master/CMakeModules/FindFUSE.cmake https://github.com/Pronghorn/pronghorn/blob/master/FindFUSE.cmake

我似乎都没有工作:

...argsparse.c:21:22: fatal error: fuse_opt.h: No such file or directory
 #include <fuse_opt.h>
                      ^
compilation terminated.

python 脚本可以运行,但这表明 cmake 的配置方式有问题。

作为参考,上面的 pkg-config 行在我的系统上输出以下内容。 -D_FILE_OFFSET_BITS=64 -I/usr/include/fuse -lfuse -pthread

感谢您的帮助!


根据弗雷泽的反馈,我更新了两件事。 我的 CMakeLists.txt 现在看起来像:

cmake_minimum_required (VERSION 2.8.11)
project (HomeFS)

set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
    "${CMAKE_SOURCE_DIR}/CMakeModules/")

find_package(FUSE REQUIRED)

add_executable(homefs
    argsparse.c
    hidden.c
    initialization.c
    resolve.c
    utilities.c
    winhomefs0.4.c)

set(CMAKE_C_FLAGS "-D_FILE_OFFSET_BITS=64 -lulockmgr")

target_include_directories(homefs PRIVATE ${FUSE_INCLUDE_DIR})
target_link_libraries(homefs ${FUSE_LIBRARIES})

并且所有对&lt;fuse.h&gt;&lt;fuse_opt.h&gt; 的引用都已更新为&lt;fuse/fuse.h&gt; 等等。我还必须添加标志-D_FILE_OFFSET_BITS=64,它现在可以干净地编译了。

但是我仍然收到链接器错误。

winhomefs0.4.c:(.text+0x10b2): undefined reference to `ulockmgr_op'
collect2: error: ld returned 1 exit status

我尝试将 lib -lulockmgr 添加到 c 标志,但这不起作用。 Google 在这方面不是我的朋友,很少有人提到 ulockmgr 我需要实现 FindULOCKMGR CMake 模块,还是需要在其他地方添加该行?


好的,经过反复试验 + 逻辑思考后,我解决了将 -lulockmgr 字符串从 CFLAGS 移动到 target_link_libraries 行所需的问题。

【问题讨论】:

    标签: python c cmake pkg-config


    【解决方案1】:

    您可能只是在 CMakeLists.txt 中遗漏了几个调用。

    find_package(FUSE REQUIRED) 行将尝试查找 FUSE 标头和 FUSE 库的路径。两个 FindFUSE.cmake 文件顶部的注释块提供了每个设置的变量的详细信息。以 encfs 为例。它将 FUSE_FOUND 设置为 true 或 false,允许您在未找到 FUSE 时退出脚本并显示有用的错误消息。

    变量FUSE_INCLUDE_DIR 将设置为包含 FUSE 标头的文件夹的绝对路径。 FUSE_LIBRARIES 将设置为 FUSE 库的绝对路径列表。

    您的 CMakeLists.txt 目前缺少的是使用这些变量。

    您可以在调用 target_include_directoriestarget_link_libraries 时使用它们 - 例如

    target_include_directories(homefs PRIVATE ${FUSE_INCLUDE_DIR})
    target_link_libraries(homefs ${FUSE_LIBRARIES})
    

    另一个问题是,您使用五个 add_library 调用创建了五个单独的库,但随后没有使用它们。至少我希望看到这些也通过target_link_libraries 调用链接到exe。

    我不太了解 Python,无法知道原始脚本在做什么,但我认为更有可能的解决方案是这些都应该只是 exe 的一部分:

    add_library(argsparse argsparse.c) add_library(hidden hidden.c) add_library(initialization initialization.c) add_library(resolve resolve.c) add_library(utilities utilities.c) add_executable(homefs argsparse.c hidden.c initialization.c resolve.c utilities.c winhomefs0.4.c)

    【讨论】:

    • 感谢您的反馈,我现在可以编译代码,但仍然出现链接器错误。我已根据您的反馈更新了我的问题,并提供了更多详细信息。
    • 没关系,我解决了。我会在上面更新我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 2018-01-26
    • 2018-12-23
    相关资源
    最近更新 更多